Android實(shí)現(xiàn)緩存大圖到SD卡
本文實(shí)例為大家分享了Android實(shí)現(xiàn)緩存大圖到SD卡的具體代碼,供大家參考,具體內(nèi)容如下
該功能主要針對(duì)資源圖片過(guò)大占用apk體積,所以先將圖片事先下載,在通過(guò)Glide加載時(shí)先去本地取,取值成功時(shí)直接應(yīng)用且節(jié)省了時(shí)間,若本地圖片不存在或取值失敗等,在通過(guò)網(wǎng)絡(luò)加載。。。
1、開(kāi)啟子線程
2、通過(guò)圖片url進(jìn)行本地緩存
3、判斷SD是否掛載
4、判斷本地是否存在該文件
5、存在將文件放到指定路徑下
public void downloadOnly(@Nullable final List<String> imageUrlList) {
if (Tools.isEmpty(imageUrlList)) {
return;
}
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
return;
}
new Thread(new Runnable() {
@Override
public void run() {
final File parent = MainApplication.getContext().getExternalCacheDir();
for (String url : imageUrlList) {
try {
File tempFile = findImageByUrl(url, Tools.getApplication());
if (tempFile == null) {
File file = Glide
.with(MainApplication.getContext())
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get();
Uri uri = Uri.parse(url);
String fileName = uri.getLastPathSegment();
if (Tools.notEmpty(fileName)) {
copy(file, new File(parent, uri.getLastPathSegment()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
//復(fù)制文件
public void copy(File source, File target) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(source);
fileOutputStream = new FileOutputStream(target);
byte[] buffer = new byte[1024];
while (fileInputStream.read(buffer) > 0) {
fileOutputStream.write(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1、判斷SD是否掛載
2、判斷文件URL是否為空
3、判斷文件是否存在
//查找本地文件是否存在
@Nullable
public static File findImageByUrl(@Nullable String url, @Nullable Context context) {
if (Tools.isEmpty(url) || context == null) {
return null;
}
try {
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
return null;
}
Uri uri = Uri.parse(url);
String fileName = uri.getLastPathSegment();
if (Tools.notEmpty(fileName)) {
File file = new File(context.getExternalCacheDir(), fileName);
return file.exists() ? file : null;
}
} catch (Exception e) {
return null;
}
return null;
}
如上流程操作后,網(wǎng)絡(luò)穩(wěn)定的情況下已經(jīng)將文件下載到本地了,只需調(diào)用該方法加載即可,如若網(wǎng)絡(luò)不穩(wěn)定的沒(méi)下載成功情況下也沒(méi)事,glide會(huì)協(xié)助加載的!??!
/**
* 加載圖片
* 先從緩存中根據(jù)url對(duì)應(yīng)名稱判斷是否有圖片
*/
public static void loadImageByCacheFirst(Context context, String url, ImageView imageView) {
try {
if (context == null) {
return;
}
File file = findImageByUrl(url, context);
if (file != null) {
Glide.with(context).load(file).into(imageView);
} else {
Glide.with(context).load(url).into(imageView);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)頁(yè)面滑動(dòng)切換動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)頁(yè)面滑動(dòng)切換動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android編程根據(jù)系列圖片繪制動(dòng)畫(huà)實(shí)例總結(jié)
這篇文章主要介紹了Android編程根據(jù)系列圖片繪制動(dòng)畫(huà)的方法,以實(shí)例形式總結(jié)了Android根據(jù)圖片繪制動(dòng)畫(huà)的常見(jiàn)情況與具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
兩分鐘讓你徹底明白Android Activity生命周期的詳解(圖文介紹)
本篇文章是對(duì)Android的生命周期進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android跳轉(zhuǎn)系統(tǒng)設(shè)置Settings的各個(gè)界面詳解
系統(tǒng)設(shè)置Settings中定義的一些常用的各界面ACTION常量,下面這篇文章主要給大家介紹了關(guān)于Android跳轉(zhuǎn)系統(tǒng)設(shè)置Settings的各個(gè)界面,文中介紹非常詳細(xì),需要的朋友可以參考下2023-01-01
Android持久化技術(shù)之文件的讀取與寫(xiě)入實(shí)例詳解
這篇文章主要介紹了Android持久化技術(shù)之文件的讀取與寫(xiě)入操作,結(jié)合實(shí)例形式較為詳細(xì)的分析講述了Android持久化操作的相關(guān)技巧與具體實(shí)現(xiàn)方法,需要的朋友可以參考下2016-01-01
Android開(kāi)發(fā)TextvView實(shí)現(xiàn)鏤空字體效果示例代碼
這篇文章主要介紹了Android開(kāi)發(fā)TextvView實(shí)現(xiàn)鏤空字體效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
android FragmentTabhost實(shí)現(xiàn)導(dǎo)航分頁(yè)
這篇文章主要為大家詳細(xì)介紹了android FragmentTabhost實(shí)現(xiàn)導(dǎo)航分頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android Studio時(shí)間選擇器的創(chuàng)建方法
這篇文章主要為大家詳細(xì)介紹了Android Studio時(shí)間選擇器的創(chuàng)建方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android?APN數(shù)據(jù)庫(kù)查詢對(duì)比分析(APN案例)
文章詳細(xì)介紹了Android中APN數(shù)據(jù)查詢的實(shí)現(xiàn)方式,文章說(shuō)明了如何避免在主線程進(jìn)行IO操作,從而提高應(yīng)用的響應(yīng)性和用戶體驗(yàn),感興趣的朋友一起看看吧2025-03-03

