日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android网络图片加载三级缓存

發布時間:2023/12/20 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android网络图片加载三级缓存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

網絡圖片的加載在Android的開發中是一個必不可少的功能,今天我們就來聊聊網絡圖片加載三級緩存策略。
所謂的三級緩存策略是指通過網絡、本地、內存三級來緩存圖片,減少不必要的網絡交互,避免浪費流量。

  • 內存緩存, 優先加載, 速度最快
  • 本地緩存, 次優先加載, 速度快
  • 網絡緩存, 不優先加載, 速度慢, 浪費流量

二、核心代碼

網絡圖片加載工具類ImageLoader.java

package com.czhappy.helloimageloader;import android.graphics.Bitmap; import android.widget.ImageView;import com.czhappy.helloimageloader.core.LocalCacheUtils; import com.czhappy.helloimageloader.core.MemoryCacheUtils; import com.czhappy.helloimageloader.core.NetCacheUtils; import com.czhappy.helloimageloader.utils.LogUtil; import com.czhappy.helloimageloader.utils.Utils;/*** Description:網絡圖片加載工具類* User: chenzheng* Date: 2017/2/11 0011* Time: 11:21*/ public class ImageLoader {private static ImageLoader mInstance = null;private NetCacheUtils mNetCacheUtils;private LocalCacheUtils mLocalCacheUtils;private MemoryCacheUtils mMemoryCacheUtils;public static ImageLoader getInstance(){if(mInstance==null){synchronized (ImageLoader.class){if(mInstance==null){mInstance = new ImageLoader();}}}return mInstance;}private ImageLoader(){mMemoryCacheUtils=new MemoryCacheUtils();mLocalCacheUtils=new LocalCacheUtils();mNetCacheUtils=new NetCacheUtils(mLocalCacheUtils,mMemoryCacheUtils);}/*** 加載網絡圖片* @param mImageView* @param url*/public void loadImageView(ImageView mImageView, String url) {mImageView.setImageResource(R.drawable.empty_photo);if(Utils.isEmpty(url)){return;}Bitmap bitmap;//內存緩存LogUtil.i("嘗試從內存中獲取圖片...");bitmap=mMemoryCacheUtils.getBitmapFromMemory(url);if (bitmap!=null){mImageView.setImageBitmap(bitmap);return;}//本地緩存LogUtil.i("嘗試從本地獲取圖片...");bitmap = mLocalCacheUtils.getBitmapFromLocal(url);if(bitmap !=null){mImageView.setImageBitmap(bitmap);//從本地獲取圖片后,保存至內存中mMemoryCacheUtils.setBitmapToMemory(url,bitmap);return;}//網絡緩存LogUtil.i("嘗試從網絡獲取圖片...");mNetCacheUtils.getBitmapFromNet(mImageView,url);} }

內存緩存MemoryCacheUtils.java

package com.czhappy.helloimageloader.core;import android.graphics.Bitmap; import android.util.LruCache;/*** Description: 內存緩存* User: chenzheng* Date: 2017/2/11 0011* Time: 11:15*/ public class MemoryCacheUtils {private LruCache<String,Bitmap> mMemoryCache;public MemoryCacheUtils(){long maxMemory = Runtime.getRuntime().maxMemory()/8;//得到手機最大允許內存的1/8,即超過指定內存,則開始回收//需要傳入允許的內存最大值,虛擬機默認內存16M,真機不一定相同mMemoryCache=new LruCache<String,Bitmap>((int) maxMemory){//在每次存入緩存的時候調用,用于計算每個條目的大小@Overrideprotected int sizeOf(String key, Bitmap value) {int byteCount = value.getByteCount();return byteCount;}};}/*** 從內存中讀圖片* @param url*/public Bitmap getBitmapFromMemory(String url) {Bitmap bitmap = mMemoryCache.get(url);return bitmap;}/*** 往內存中寫圖片* @param url* @param bitmap*/public void setBitmapToMemory(String url, Bitmap bitmap) {mMemoryCache.put(url,bitmap);} }

本地緩存LocalCacheUtils.java

package com.czhappy.helloimageloader.core;import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment;import com.czhappy.helloimageloader.utils.MD5Util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** Description: 本地緩存* User: chenzheng* Date: 2017/2/11 0011* Time: 11:15*/ public class LocalCacheUtils {private static final String CACHE_PATH= Environment.getExternalStorageDirectory().getAbsolutePath()+"/HelloImageLoader";/*** 從本地讀取圖片* @param url*/public Bitmap getBitmapFromLocal(String url){String fileName = null;//把圖片的url當做文件名,并進行MD5加密try {fileName = MD5Util.GetMD5Code(url);File file=new File(CACHE_PATH,fileName);if(file.exists()){Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));return bitmap;}} catch (Exception e) {e.printStackTrace();}return null;}/*** 從網絡獲取圖片后,保存至本地緩存* @param url* @param bitmap*/public void setBitmapToLocal(String url,Bitmap bitmap){try {String fileName = MD5Util.GetMD5Code(url);//把圖片的url當做文件名,并進行MD5加密File file=new File(CACHE_PATH,fileName);//通過得到文件的父文件,判斷父文件是否存在File parentFile = file.getParentFile();if (!parentFile.exists()){parentFile.mkdirs();}//把圖片保存至本地bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file));} catch (Exception e) {e.printStackTrace();}} }

網絡緩存NetCacheUtils.java

package com.czhappy.helloimageloader.core;import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.widget.ImageView;import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL;/*** Description: 網絡緩存* User: chenzheng* Date: 2017/2/11 0011* Time: 11:15*/ public class NetCacheUtils {private LocalCacheUtils mLocalCacheUtils;private MemoryCacheUtils mMemoryCacheUtils;public NetCacheUtils(LocalCacheUtils localCacheUtils, MemoryCacheUtils memoryCacheUtils) {mLocalCacheUtils = localCacheUtils;mMemoryCacheUtils = memoryCacheUtils;}/*** 從網絡下載圖片* @param mImageView 顯示圖片的imageview* @param url 下載圖片的網絡地址*/public void getBitmapFromNet(ImageView mImageView, String url) {new BitmapTask().execute(mImageView, url);//啟動AsyncTask}/*** AsyncTask就是對handler和線程池的封裝* 第一個泛型:參數類型* 第二個泛型:更新進度的泛型* 第三個泛型:onPostExecute的返回結果*/class BitmapTask extends AsyncTask<Object, Void, Bitmap> {private ImageView mImageView;private String url;/*** 后臺耗時操作,存在于子線程中* @param params* @return*/@Overrideprotected Bitmap doInBackground(Object[] params) {mImageView = (ImageView) params[0];url = (String) params[1];return downLoadBitmap(url);}/*** 更新進度,在主線程中* @param values*/@Overrideprotected void onProgressUpdate(Void[] values) {super.onProgressUpdate(values);}/*** 耗時方法結束后執行該方法,主線程中* @param result*/@Overrideprotected void onPostExecute(Bitmap result) {if (result != null) {mImageView.setImageBitmap(result);//從網絡獲取圖片后,保存至本地緩存mLocalCacheUtils.setBitmapToLocal(url, result);//保存至內存中mMemoryCacheUtils.setBitmapToMemory(url, result);}}}/*** 網絡下載圖片* @param url* @return*/private Bitmap downLoadBitmap(String url) {HttpURLConnection conn = null;try {conn = (HttpURLConnection) new URL(url).openConnection();conn.setConnectTimeout(5000);conn.setReadTimeout(5000);conn.setRequestMethod("GET");int responseCode = conn.getResponseCode();if (responseCode == 200) {//圖片壓縮BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize=2;//寬高壓縮為原來的1/2options.inPreferredConfig=Bitmap.Config.ARGB_4444;Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream(),null,options);return bitmap;}} catch (IOException e) {e.printStackTrace();} finally {conn.disconnect();}return null;} }

測試類

package com.czhappy.helloimageloaderdemo;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ImageView;import com.czhappy.helloimageloader.ImageLoader;public class MainActivity extends AppCompatActivity {private ImageView my_image;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);my_image = (ImageView) findViewById(R.id.my_image);}public void beginLoad(View view){String url = "http://img06.tooopen.com/images/20161112/tooopen_sy_185726882764.jpg";ImageLoader.getInstance().loadImageView(my_image, url);} }

三、實現效果圖

總結

以上是生活随笔為你收集整理的Android网络图片加载三级缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。