详解Android的Splash启动图的两种动态切换方式
冷启动的时候因为要考虑网路原因,默认显示一张本地图片。
热启动的时候会根据获取的启动图是否是新动态替换。
以下是实现动态替换的两种方式:
Glide的缓存下载
Glide中的downloadOnly方法可实现图片的下载功能
图片下载
Observable.just(RetrofitHelper.API_BASE_URL+img) .subscribeOn(Schedulers.newThread()) .subscribe(newAction1(){ @Override publicvoidcall(Strings){ try{ Glide.with(getApplicationContext()) .load(s) .downloadOnly(720,1280) .get(); }catch(InterruptedException|ExecutionExceptione){ e.printStackTrace(); } } });
每次启动的时候去获取
Filefile=newFile(sp_splash_logo); if(file.exists()){ Glide.with(getApplicationContext()).load(file).into(mIvSplash); }else{ mIvSplash.setImageResource(R.mipmap.splash); }
Retofit+RxJava的本地下载
考虑到项目中用到的client是okhttp并统一了Interceptor拦截器,在用到下载图片,所以就单独提出来了。
- 创建一个service,并在配置文件AndroidManifest.xml中注册
- 在获取到图片地址之后startService(),并传递到service中
- 在service的onStartCommand()方法中获取到图片地址,并创建ImgServise开始下载
下载的代码如下
Retrofitretrofit=newRetrofit.Builder() .baseUrl(RetrofitHelper.API_BASE_URL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ImgServiseimgServise=retrofit.create(ImgServise.class); imgServise.downloadPicFromNet(img) .subscribeOn(Schedulers.newThread()) .subscribe(newAction1(){ @Override publicvoidcall(ResponseBodyresponseBody){ try{ longcontentLength=responseBody.contentLength(); InputStreamis=responseBody.byteStream(); Filefile=newFile(Environment.getExternalStorageDirectory(),BuildConfig.APPLICATION_ID+"splash.png"); FileOutputStreamfos=newFileOutputStream(file); BufferedInputStreambis=newBufferedInputStream(is); byte[]buffer=newbyte[1024]; intlen; longsum=0L; while((len=bis.read(buffer))!=-1){ fos.write(buffer,0,len); sum+=len; fos.flush(); //增加下载进度的获取 Log.d("TAG---",sum+"/"+contentLength); } fos.close(); bis.close(); is.close(); }catch(IOExceptione){ e.printStackTrace(); }finally{ stopSelf(); } } },newAction1 (){ @Override publicvoidcall(Throwablethrowable){ stopSelf(); } });
获取到的图片重新命名再进行显示。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。