Android使用AsyncTask加載圖片的操作流程
加載圖片基本操作
一、創(chuàng)建AsyncTask子類
- 將ImageView的弱引用設(shè)置為成員變量,創(chuàng)建構(gòu)造函數(shù)傳入ImageView對(duì)象。
- 調(diào)用指定大小解析Bitmap方法。
- 因?yàn)槭侨跻?,所以必須判斷引用是否被回收。如果異步任?wù)完成前,用戶離開Activity或者設(shè)置發(fā)生改變,ImageView也可能不存在。
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; private int data = 0; public BitmapWorkerTask(ImageView imageView) { // Use a WeakReference to ensure the ImageView can be garbage collected imageViewReference = new WeakReference<ImageView>(imageView); } // Decode image in background. @Override protected Bitmap doInBackground(Integer... params) { data = params[0]; return decodeSampledBitmapFromResource(getResources(), data, 100, 100)); } // Once complete, see if ImageView is still around and set bitmap. @Override protected void onPostExecute(Bitmap bitmap) { if (imageViewReference != null && bitmap != null) { final ImageView imageView = imageViewReference.get(); if (imageView != null) { imageView.setImageBitmap(bitmap); } } } }
二、創(chuàng)建異步任務(wù)實(shí)例對(duì)象,開始執(zhí)行
public void loadBitmap(int resId, ImageView imageView) { BitmapWorkerTask task = new BitmapWorkerTask(imageView); task.execute(resId); }
處理并發(fā)
因?yàn)長istView和GridView復(fù)用子布局,無法保證異步任務(wù)完成時(shí),相關(guān)的布局沒有被回收。也無法保證異步任務(wù)完成時(shí)間的先后順序。所以必須處理并發(fā)事件。
一、創(chuàng)建BitmapDrawable子類
該類專門用來保存Bitmap及其對(duì)應(yīng)的異步任務(wù)
static class AsyncDrawable extends BitmapDrawable { private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference; public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { super(res, bitmap); bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask); } public BitmapWorkerTask getBitmapWorkerTask() { return bitmapWorkerTaskReference.get(); } }
二、綁定AsyncDrawable
創(chuàng)建AsyncDrawable并傳入BitmapWorkerTask對(duì)象,imageView設(shè)置為該AsyncDrawable再開始異步任務(wù)
public void loadBitmap(int resId, ImageView imageView) { if (cancelPotentialWork(resId, imageView)) { final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), mPlaceHolderBitmap, task); imageView.setImageDrawable(asyncDrawable); task.execute(resId); } }
cancelPotentialWork這個(gè)方法用于調(diào)用方法獲取控件對(duì)應(yīng)異步任務(wù),判斷是否與當(dāng)前任務(wù)一致
public static boolean cancelPotentialWork(int data, ImageView imageView) { final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (bitmapWorkerTask != null) { final int bitmapData = bitmapWorkerTask.data; // If bitmapData is not yet set or it differs from the new data if (bitmapData == 0 || bitmapData != data) { // Cancel previous task bitmapWorkerTask.cancel(true); } else { // The same work is already in progress return false; } } // No task associated with the ImageView, or an existing task was cancelled return true; }
這個(gè)getBitmapWorkerTask()方法用于獲取圖片對(duì)應(yīng)異步任務(wù)
private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { if (imageView != null) { final Drawable drawable = imageView.getDrawable(); if (drawable instanceof AsyncDrawable) { final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; return asyncDrawable.getBitmapWorkerTask(); } } return null; }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
android 關(guān)于利用簽名的SHA1進(jìn)行安全校驗(yàn)的方法之一(推薦)
下面小編就為大家?guī)硪黄猘ndroid 關(guān)于利用簽名的SHA1進(jìn)行安全校驗(yàn)的方法之一(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01Android App中使用AudioManager類來編寫音頻播放器
這篇文章主要介紹了Android App中使用AudioManager類來編寫音樂播放器的方法,文中舉了一個(gè)簡單的例子實(shí)現(xiàn)了基礎(chǔ)的播放暫停和靜音等功能,需要的朋友可以參考下2016-04-04Android學(xué)習(xí)項(xiàng)目之簡易版微信為例(二)
這篇文章主要以簡易版微信為例,實(shí)現(xiàn)簡易版微信的登陸、注冊(cè)界面的編寫與簡單交互,感興趣的小伙伴們可以參考一下2016-06-06Android藍(lán)牙服務(wù)查找附近設(shè)備分析探索
這篇文章主要介紹了Android藍(lán)牙服務(wù)實(shí)現(xiàn)查找附近設(shè)備,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的2023-01-01Android 基于google Zxing實(shí)現(xiàn)二維碼、條形碼掃描,仿微信二維碼掃描效果(推薦)
這篇文章主要介紹了 Android 基于google Zxing實(shí)現(xiàn)二維碼、條形碼掃描,仿微信二維碼掃描效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Android自定義View 實(shí)現(xiàn)水波紋動(dòng)畫引導(dǎo)效果
在android程序開發(fā)中,我們經(jīng)常簡單通過自定義view實(shí)現(xiàn)水波紋動(dòng)畫引導(dǎo)功能,下面通過本文給大家分享實(shí)現(xiàn)代碼,需要的朋友參考下2017-01-01Flutter開發(fā)實(shí)現(xiàn)底部留言板
這篇文章主要為大家詳細(xì)介紹了Flutter開發(fā)實(shí)現(xiàn)底部留言板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03