【從零開始寫一個簡單的ImageLoader框架】MyImageLoader程式碼簡介

許佳佳233發表於2016-08-12

#相關文章
【從零開始寫一個簡單的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);
                }
            }
        }
    };

#專案下載地址

http://download.csdn.net/detail/double2hao/9601732

相關文章