【從零開始寫一個簡單的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);
}
}
}
};
#專案下載地址
相關文章
- 從零開始實現一個簡易的Java MVC框架JavaMVC框架
- 從零開始寫一個微前端框架-沙箱篇前端框架
- 從零開始實現簡單 RPC 框架 4:註冊中心RPC框架
- 從零開始寫一個簡單的註冊登入系統(Servlet+Tomcat+MySQL+IDEA)ServletTomcatMySqlIdea
- 從零開始寫一個ExporterExport
- 從零開始實現一個簡易的Java MVC框架(八)–製作StarterJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(七)–實現MVCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(三)--實現IOCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(四)--實現AOPJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(七)--實現MVCJavaMVC框架
- 從零開始實現一個簡易的Java MVC框架(八)--製作StarterJavaMVC框架
- 從零開始手寫一個微前端框架-渲染篇前端框架
- 《Python深度學習從零開始學》簡介Python深度學習
- 從零開始實現簡單 RPC 框架 1:RPC 框架的結構和設計RPC框架
- 從零開始的簡單光線追蹤示例
- 寫一個簡單的程式碼生成器
- 從零開始實現一個簡易的Java MVC框架(二)--實現Bean容器JavaMVC框架Bean
- 從零開始實現一個簡易的Java MVC框架(六)--加強AOP功能JavaMVC框架
- 從零開始實現一個RPC框架(零)RPC框架
- 從零開始編寫一個 Python 非同步 ASGI WEB 框架Python非同步Web框架
- 從零開始實現簡單 RPC 框架 3:配置匯流排 URLRPC框架
- 從零開始實現簡單 RPC 框架 2:擴充套件利器 SPIRPC框架套件
- 《谷歌JAX深度學習從零開始學》簡介谷歌深度學習
- 現在寫從零組裝一個簡單的web框架系列文件會有人看嗎?Web框架
- 從零開始做一個SLG遊戲(二):用mesh實現簡單的地形遊戲
- 從零開始實現一個RPC框架(一)RPC框架
- 從零開始仿寫一個抖音App——開始APP
- 從零開始實現簡單 RPC 框架 6:網路通訊之 NettyRPC框架Netty
- 從零開始寫一個微前端框架-資料通訊篇前端框架
- 從零開始寫一個微前端框架-樣式隔離篇前端框架
- 從零開始寫一個node爬蟲(一)爬蟲
- webpack從零開始搭建多頁面(一):webpack起步到執行一個簡單的demoWeb
- Flask之旅: 寫一個簡單的Python Web框架FlaskPythonWeb框架
- 從零開始學前端動畫 —— 簡單的特效登入前端動畫特效
- 從零開始,如何用puppeteer寫一個爬蟲指令碼爬蟲指令碼
- 從零開始開發Android相機app(三)簡單介紹影象濾鏡功能AndroidAPP
- 從零開始實現一個RPC框架(四)RPC框架
- 從零開始實現一個RPC框架(二)RPC框架
- 從零開始實現一個RPC框架(五)RPC框架