Android實現(xiàn)緩存大圖到SD卡
本文實例為大家分享了Android實現(xiàn)緩存大圖到SD卡的具體代碼,供大家參考,具體內(nèi)容如下
該功能主要針對資源圖片過大占用apk體積,所以先將圖片事先下載,在通過Glide加載時先去本地取,取值成功時直接應(yīng)用且節(jié)省了時間,若本地圖片不存在或取值失敗等,在通過網(wǎng)絡(luò)加載。。。
1、開啟子線程
2、通過圖片url進行本地緩存
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)定的沒下載成功情況下也沒事,glide會協(xié)助加載的?。?!
/** * 加載圖片 * 先從緩存中根據(jù)url對應(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(); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android RecyclerView添加FootView和HeadView
這篇文章主要介紹了Android RecyclerView添加FootView和HeadView的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10Android EditText搜索框?qū)崿F(xiàn)圖標(biāo)居中
本篇文章主要介紹了Android EditText搜索框?qū)崿F(xiàn)圖標(biāo)居中,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Android賬號注冊實現(xiàn)點擊獲取驗證碼倒計時效果
這篇文章主要為大家詳細介紹了Android賬號注冊過程中實現(xiàn)點擊獲取驗證碼倒計時效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05Android打包篇:Android Studio將代碼打包成jar包教程
這篇文章主要介紹了Android打包篇:Android Studio將代碼打包成jar包教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android基于Fresco實現(xiàn)圓角和圓形圖片
這篇文章主要為大家詳細介紹了Android基于Fresco實現(xiàn)圓角和圓形圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04圖解 Kotlin SharedFlow 緩存系統(tǒng)及示例詳解
這篇文章主要為大家介紹了圖解 Kotlin SharedFlow 緩存系統(tǒng)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10