冷启动的时候因为要考虑网路原因,默认显示一张本地图片。
热启动的时候会根据获取的启动图是否是新动态替换。
以下是实现动态替换的两种方式:
Glide的缓存下载
Glide中的downloadOnly
方法可实现图片的下载功能
- 图片下载
Observable.just(RetrofitHelper.API_BASE_URL + img)
.subscribeOn(Schedulers.newThread())
.subscribe(new Action1<String>() {
@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<ResponseBody>() {
@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<Throwable>() {
@Override
public void call(Throwable throwable) {
stopSelf();
}
});
获取到的图片重新命名再进行显示。
网友评论