重庆幸运农场中奖金额|重庆幸运农场官网
MyException - 我的異常網
當前位置:我的異常網» 圖形/圖像 » 拆車輪:LocalImageLoader

拆車輪:LocalImageLoader

www.h0f1.com  網友分享于:2013-09-19  瀏覽:0次
拆輪子:LocalImageLoader
我們在開發中遇到了一個問題:制作本地圖片選擇功能時,加載圖片可以選擇fresco,自帶緩存,加載迅速。但是在加載screenshot這個截圖相冊的時候,fresco加載異常緩慢。所以我們需要一個自己寫一個相冊加載類。另外如果不想用第三方開源庫,這個類也是一個很好地選擇。

我們一步一步來。
第一步:
簡單粗暴的多線程加載

public void loadImage(final String path, final ImageView imageView) {
        imageView.setTag(path);

        // UI線程
        if (mHandler == null) {
            mHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    ImgBeanHolder holder = (ImgBeanHolder) msg.obj;
                    ImageView imageView = holder.imageView;
                    Bitmap bm = holder.bitmap;
                    String path = holder.path;
                    if (imageView.getTag().toString().equals(path)) {
                        imageView.setImageBitmap(bm);
                    }
                    holder.imageView = null;//否則隨著手勢滑動,內存不會釋放,滑動一會兒直接就oom了
                }
            };
        }


        Runnable runnable = new Runnable() {
            @Override
            public void run() {

                ImageSize imageSize = getImageViewWidth(imageView);

                int reqWidth = imageSize.width;
                int reqHeight = imageSize.height;

                Bitmap bm = decodeSampledBitmapFromResource(path, reqWidth,
                        reqHeight);
//                addBitmapToLruCache(path, bm);//將讀取出的bitmap加入緩存
                ImgBeanHolder holder = new ImgBeanHolder();
//                holder.bitmap = getBitmapFromLruCache(path);
                holder.bitmap = bm;
                holder.imageView = imageView;
                holder.path = path;
                Message message = Message.obtain();
                message.obj = holder;
                // Log.e("TAG", "mHandler.sendMessage(message);");
                mHandler.sendMessage(message);
//                mPoolSemaphore.release();
            }
        };

        new Thread(runnable).start();
    }



這個時候,相冊可以加載出來,但是滑動會非常卡頓。
運行程序,我們可以在monitor中看到,隨著手勢滑動,卡頓非常嚴重,CPU占用也很高。在ddms中看到瞬間多了30多個線程。。。。
并且沒有緩存,滑出屏幕的所有元素,再滑動回來,都是空白,需要重新加載。



第二部:
加上lru緩存
下面為loadImage方法中主要的改動
        Bitmap bm = getBitmapFromLruCache(path);
        Log.d("cchen", path + " hit " + bm);

  //從緩存取bitmap,判斷是否命中
        if (bm != null) {
            ImgBeanHolder holder = new ImgBeanHolder();
            holder.bitmap = bm;
            holder.imageView = imageView;
            holder.path = path;
            Message message = Message.obtain();
            message.obj = holder;
            mHandler.sendMessage(message);

            return;
        }

//............
    Bitmap bm = decodeSampledBitmapFromResource(path, reqWidth,
                        reqHeight);
                [color=red]addBitmapToLruCache(path, bm)[/color];//將讀取出的bitmap加入緩存
                ImgBeanHolder holder = new ImgBeanHolder();
                holder.bitmap = getBitmapFromLruCache(path);
//                holder.bitmap = bm;
                holder.imageView = imageView;


//............


加上LRU后,第一次加載的速度差不多。但是來回滑動后,緩存會命中很多,這樣滑動一屏,新建的線程只有原來的一半15個,而且滑動回來后,很多圖片也還在顯示,不需要重新加載。卡頓減輕了很多但仍然有。
并且加載速度不夠理想。

第三步:

土逼啃蹄牛




文章評論

團隊中“技術大拿”并非越多越好
團隊中“技術大拿”并非越多越好
旅行,寫作,編程
旅行,寫作,編程
Web開發者需具備的8個好習慣
Web開發者需具備的8個好習慣
代碼女神橫空出世
代碼女神橫空出世
中美印日四國程序員比較
中美印日四國程序員比較
編程語言是女人
編程語言是女人
程序員最害怕的5件事 你中招了嗎?
程序員最害怕的5件事 你中招了嗎?
漫畫:程序員的工作
漫畫:程序員的工作
10個幫程序員減壓放松的網站
10個幫程序員減壓放松的網站
程序員應該關注的一些事兒
程序員應該關注的一些事兒
“骯臟的”IT工作排行榜
“骯臟的”IT工作排行榜
5款最佳正則表達式編輯調試器
5款最佳正則表達式編輯調試器
十大編程算法助程序員走上高手之路
十大編程算法助程序員走上高手之路
60個開發者不容錯過的免費資源庫
60個開發者不容錯過的免費資源庫
什么才是優秀的用戶界面設計
什么才是優秀的用戶界面設計
如何區分一個程序員是“老手“還是“新手“?
如何區分一個程序員是“老手“還是“新手“?
Google倫敦新總部 猶如星級莊園
Google倫敦新總部 猶如星級莊園
總結2014中國互聯網十大段子
總結2014中國互聯網十大段子
看13位CEO、創始人和高管如何提高工作效率
看13位CEO、創始人和高管如何提高工作效率
聊聊HTTPS和SSL/TLS協議
聊聊HTTPS和SSL/TLS協議
老程序員的下場
老程序員的下場
每天工作4小時的程序員
每天工作4小時的程序員
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“懶”出效率是程序員的美德
“懶”出效率是程序員的美德
程序員周末都喜歡做什么?
程序員周末都喜歡做什么?
如何成為一名黑客
如何成為一名黑客
程序員眼里IE瀏覽器是什么樣的
程序員眼里IE瀏覽器是什么樣的
我的丈夫是個程序員
我的丈夫是個程序員
不懂技術不要對懂技術的人說這很容易實現
不懂技術不要對懂技術的人說這很容易實現
程序員的一天:一寸光陰一寸金
程序員的一天:一寸光陰一寸金
寫給自己也寫給你 自己到底該何去何從
寫給自己也寫給你 自己到底該何去何從
2013年美國開發者薪資調查報告
2013年美國開發者薪資調查報告
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序員的鄙視鏈
程序員的鄙視鏈
為啥Android手機總會越用越慢?
為啥Android手機總會越用越慢?
一個程序員的時間管理
一個程序員的時間管理
10個調試和排錯的小建議
10個調試和排錯的小建議
Java程序員必看電影
Java程序員必看電影
當下全球最炙手可熱的八位少年創業者
當下全球最炙手可熱的八位少年創業者
做程序猿的老婆應該注意的一些事情
做程序猿的老婆應該注意的一些事情
我是如何打敗拖延癥的
我是如何打敗拖延癥的
程序員和編碼員之間的區別
程序員和編碼員之間的區別
程序員都該閱讀的書
程序員都該閱讀的書
程序員必看的十大電影
程序員必看的十大電影
那些性感的讓人尖叫的程序員
那些性感的讓人尖叫的程序員
Java 與 .NET 的平臺發展之爭
Java 與 .NET 的平臺發展之爭
為什么程序員都是夜貓子
為什么程序員都是夜貓子
我跳槽是因為他們的顯示器更大
我跳槽是因為他們的顯示器更大
Web開發人員為什么越來越懶了?
Web開發人員為什么越來越懶了?
軟件開發程序錯誤異常ExceptionCopyright © 2009-2015 MyException 版權所有
重庆幸运农场中奖金额