Android的Splash启动图的两种动态切换方式

冷启动的时候因为要考虑网路原因,默认显示一张本地图片。
热启动的时候会根据获取的启动图是否是新动态替换。

以下是实现动态替换的两种方式:

Glide的缓存下载

Glide中的downloadOnly方法可实现图片的下载功能

  • 图片下载
Observable.just(RetrofitHelper.API_BASE_URL + img)                       
        .subscribeOn(Schedulers.newThread())                             
        .subscribe(new Action1() {                               
            @Override                                                    
            public void call(String s) {                                 
                try {                                                    
                    Glide.with(getApplicationContext())                  
                            .load(s)                                     
                            .downloadOnly(720, 1280)                     
                            .get();                                      
                } catch (InterruptedException | ExecutionException e) {  
                    e.printStackTrace();                                 
                }                                                        
            }                                                            
        });                                                              
  • 每次启动的时候去获取
    File file = new File(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开始下载

下载的代码如下

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(RetrofitHelper.API_BASE_URL)
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    ImgServise imgServise = retrofit.create(ImgServise.class);
    imgServise.downloadPicFromNet(img)
            .subscribeOn(Schedulers.newThread())
            .subscribe(new Action1() {
                @Override
                public void call(ResponseBody responseBody) {
                    try {
                        long contentLength = responseBody.contentLength();
                        InputStream is = responseBody.byteStream();
                        File file = new File(Environment.getExternalStorageDirectory(), BuildConfig.APPLICATION_ID + "splash.png");
                        FileOutputStream fos = new FileOutputStream(file);
                        BufferedInputStream bis = new BufferedInputStream(is);
                        byte[] buffer = new byte[1024];
                        int len;
                        long sum = 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 (IOException e) {
                        e.printStackTrace();
                    } finally {
                        stopSelf();
                    }
                }
            }, new Action1() {
                @Override
                public void call(Throwable throwable) {
                    stopSelf();
                }
            });

获取到的图片重新命名再进行显示。

你可能感兴趣的:(Android的Splash启动图的两种动态切换方式)