【從零開始寫一個簡單的ImageLoader框架】MyImageLoader程式碼簡介
#相關文章
【從零開始寫一個簡單的ImageLoader框架】專案介紹
【從零開始寫一個簡單的ImageLoader框架】ImageLoader分析
【從零開始寫一個簡單的ImageLoader框架】MyImageLoader程式碼簡介
#前提概要
筆者僅僅對各個java檔案作用以及一些關鍵方法進行闡述,其餘很多需要掌握的知識點已於上一篇文章中給出相應連結,還需讀者自己學習。
#程式碼預覽(須結合原始碼看)
demo包中的檔案都用於演示,也不多加闡述了。
主要為imageLoader中的內容。
#BitmapUtils
此檔案中包含了圖片壓縮的公共方法。
#ImageDiskLruCache
硬碟快取。
#ImageLruCache
記憶體快取。
#ImageThreadPoolExecutor
執行緒池。
#LoadBitmapTask
public class LoadBitmapTask implements Runnable
如上圖,LoadBitmapTask為一個Runnable,用於放入執行緒池中執行。主要邏輯為,從磁碟或者網路獲取bitmap,之後再imageView中顯示,如下:
@Override
public void run() {
//從磁碟或者網路獲取bitmap
final Bitmap bitmap = loadBitmap(uri, reqWidth, reqHeight);
//使用handler更新UI
TaskResult loaderResult = new TaskResult(imageView, bitmap);
imageHandler.obtainMessage(MESSAGE_POST_RESULT, loaderResult).sendToTarget();
if (callback != null) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
callback.onResponse(bitmap);
}
});
}
}
#MD5Utils
將url通過MD5轉化為唯一的字串,用於標識。主要用於記憶體快取和磁碟快取。
#MyImageLoader
暴露給使用者的公共方法類,主要方法為bindBitmap(),如下:
首先從記憶體快取中獲取bitmap,如果記憶體快取中沒有,就在磁碟快取中查詢,如果磁碟快取中也沒有,就從網上獲取,並且快取到磁碟快取中。
public void bindBitmap(final String uri, final ImageView imageView, final int reqWidth, final int reqHeight) {
//設定載入loadding圖片
imageView.setImageResource(R.drawable.ic_loading);
//從記憶體快取中獲取bitmap
Bitmap bitmap = imageLrucache.loadBitmapFromMemCache(uri);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
return;
}
//磁碟快取包含在LoadBitmapTask中
LoadBitmapTask loadBitmapTask = new LoadBitmapTask(mContext, imageView, uri, reqWidth, reqHeight);
//使用執行緒池去執行Runnable物件
THREAD_POOL_EXECUTOR.execute(loadBitmapTask);
}
#MyUtils
工具類,包含Log,Toast等公共方法。
#NetWork
包含網路的公共方法,主要通過url獲取到圖片。
#TaskResult
用於Handler的Message的傳遞,程式碼如下。
public class TaskResult {
public ImageView imageView;
public Bitmap bitmap;
public TaskResult(ImageView imageView, Bitmap bitmap) {
this.imageView = imageView;
this.bitmap = bitmap;
}
//使用handler更新UI
TaskResult loaderResult = new TaskResult(imageView, bitmap);
imageHandler.obtainMessage(MESSAGE_POST_RESULT, loaderResult).sendToTarget();
//對ImageView的操作屬於對UI的操作,不能再子執行緒中進行,所以要用到Handler
private Handler imageHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == MESSAGE_POST_RESULT) {
//給imageView載入bitmap
TaskResult result = (TaskResult) msg.obj;
ImageView imageView = result.imageView;
if (result.bitmap != null) {
imageView.setImageBitmap(result.bitmap);
} else {
imageView.setImageResource(R.drawable.ic_error);
}
}
}
};
#專案下載地址
相關文章
- 【從零開始寫一個簡單的ImageLoader框架】ImageLoader分析框架
- 【從零開始寫一個簡單的ImageLoader框架】專案介紹框架
- 0-開發框架Codea簡介-從零開始寫一個武俠冒險遊戲框架遊戲
- 用 Python 從零開始寫一個簡單的直譯器(3)Python
- 用 Python 從零開始寫一個簡單的直譯器(4)Python
- 用 Python 從零開始寫一個簡單的直譯器(2)Python
- 從零開始實現一個簡易的Java MVC框架JavaMVC框架
- 從零開始寫JavaScript框架(一)JavaScript框架
- 從零構建一個簡單的 Python 框架Python框架
- 從零開始寫一個微前端框架-沙箱篇前端框架
- 從零開始寫一個ExporterExport
- 從零開始編寫自己的JavaScript框架(一)JavaScript框架
- 從零開始手寫一個微前端框架-渲染篇前端框架
- 從零開始實現一個簡易的Java MVC框架(七)–實現MVCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(八)–製作StarterJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(八)--製作StarterJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(七)--實現MVCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(四)--實現AOPJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(三)--實現IOCJavaMVC框架
- 從零開始搭建一個簡單的基於webpack的vue開發環境WebVue開發環境
- 從零開始實現簡單 RPC 框架 4:註冊中心RPC框架
- 從零開始仿寫一個抖音App——開始APP
- 從零開始寫JavaScript框架(二)JavaScript框架
- 從零開始寫一個網頁網頁
- 從零開始的簡單光線追蹤示例
- 從零開始做一個SLG遊戲(二):用mesh實現簡單的地形遊戲
- 從零開始實現一個簡易的Java MVC框架(六)--加強AOP功能JavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(二)--實現Bean容器JavaMVC框架Bean
- 從零開始寫一個簡單的註冊登入系統(Servlet+Tomcat+MySQL+IDEA)ServletTomcatMySqlIdea
- 《谷歌JAX深度學習從零開始學》簡介谷歌深度學習
- 《Python深度學習從零開始學》簡介Python深度學習
- 如何從零開始學習一個框架框架
- 從零開始實現一個RPC框架(零)RPC框架
- 寫一個簡單的程式碼生成器
- 從零開始學前端動畫 —— 簡單的特效登入前端動畫特效
- 如何從零開始寫一個網站網站
- 從零開始搭建一個簡單的ui自動化測試框架04(pytest+selenium+allure)UI框架
- 從零開始寫一個微前端框架-樣式隔離篇前端框架