日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Load Picture Asynchronously

發布時間:2025/7/25 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Load Picture Asynchronously 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知Android應用開發中不能在UI線程中做耗時的操作,否則就會彈出煩人的ANR窗口。

應用開發中如果需要加載來自網絡、磁盤或其他非內存中圖片資源時,因加載時間會受到其他因素(如磁盤、網絡、圖片大小、CPU等等)的影響,很容易產生耗時操作。所以在進行類似操作時要避免在UI線程中進行。今天就和大家分享一下如何通過AsyncTask異步加載圖片和怎么處理多線程并發問題。

如何使用 AsyncTask加載圖片?

通過AysncTask可以很容易的在啟動后臺線程加載資源,然后將結果返回到UI線程中。使用它時,需要創建它的子類并實現相應的方法,如下是一個通過AysncTask和decodeSampledBitmapFromResource()方法加載一張大圖片到ImageView中的例子:

class BitmapWorkerTask extends AsyncTask {private final WeakReference imageViewReference;private int data = 0;public BitmapWorkerTask(ImageView imageView) {// Use a WeakReference to ensure the ImageView can be garbage collectedimageViewReference = new WeakReference(imageView);}// Decode image in background. @Overrideprotected Bitmap doInBackground(Integer... params) {data = params[0];return decodeSampledBitmapFromResource(getResources(), data, 100, 100));}// Once complete, see if ImageView is still around and set bitmap. @Overrideprotected void onPostExecute(Bitmap bitmap) {if (imageViewReference != null && bitmap != null) {final ImageView imageView = imageViewReference.get();if (imageView != null) {imageView.setImageBitmap(bitmap);}}} }

使用WeakReference 保存ImageView的原因,是為了在內存資源緊張時確保AsyncTask 不會阻止對其進行資源回收,因此當task結束時不能保證Imageview還存在,所以你應該在onPostExecute中對它進行驗證(本例中在Task結束前如果用戶關閉Activity,或系統設置改變時,ImageView可能會被回收)。

通過以下方式我們就可以異步加載圖片:

1 2 3 4 public void loadBitmap(int resId, ImageView imageView) { ????BitmapWorkerTask task = new BitmapWorkerTask(imageView); ????task.execute(resId); }

如何處理并發操作?

常用的View組件中 像ListView、GridView等 為了高效實用內存,用戶在進行View滾動操作時系統會對不再使用子View進行資源回收,,采用上面的方式進行圖片加載時會引入另外一個問題。如果在每個子View中開啟AsyncTask,不能保證在任務完成時,相關的View是否已經被回收。此外,也不能保證他們加載完成的順序

我們可以通過將AsyncTask的引用保存ImageView關聯Drawable中,任務完成時檢查引用是否存在.

創建一個專用的Drawable子類,存儲工作任務線程的引用。這樣在任務完成時即可將圖片設置在ImageView中

static class AsyncDrawable extends BitmapDrawable {private final WeakReference bitmapWorkerTaskReference;public AsyncDrawable(Resources res, Bitmap bitmap,BitmapWorkerTask bitmapWorkerTask) {super(res, bitmap);bitmapWorkerTaskReference =new WeakReference(bitmapWorkerTask);}public BitmapWorkerTask getBitmapWorkerTask() {return bitmapWorkerTaskReference.get();} }

在執行BitmapTask前,你可以創建AsyncDrawable并將其綁定到ImageView中

1 2 3 4 5 6 7 8 9 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判斷是否已經存在正在運行的任務綁定在ImageView中,若有,通過執行任務cancel方法取消它,當然這種情況不常發生,

下面是cancelPotentialWork的實現:

public static boolean cancelPotentialWork(int data, ImageView imageView) {final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);if (bitmapWorkerTask != null) {final int bitmapData = bitmapWorkerTask.data;if (bitmapData != data) {// Cancel previous taskbitmapWorkerTask.cancel(true);} else {// The same work is already in progressreturn false;}}// No task associated with the ImageView, or an existing task was cancelledreturn true; }

下面是一個輔助方法,通過ImageView查找與其關聯的異步任務;

1 2 3 4 5 6 7 8 9 10 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; }

?

下一步需要在BitmapWorkerTask中的onPostExecute中執行更新操作,

首先檢查任務是否取消,如后更行與其關聯的ImageView:

class BitmapWorkerTask extends AsyncTask {... @Overrideprotected void onPostExecute(Bitmap bitmap) {if (isCancelled()) {bitmap = null;}if (imageViewReference != null && bitmap != null) {final ImageView imageView = imageViewReference.get();final BitmapWorkerTask bitmapWorkerTask =getBitmapWorkerTask(imageView);if (this == bitmapWorkerTask && imageView != null) {imageView.setImageBitmap(bitmap);}}} }

通過以上方法,你就可以在ListView、GridView或者其他具有子view回收處理的組件中使用,通過調用

loadBitmap你可以很簡單的添加圖片到ImageView中,如:在GirdView的 Adapter中的getView方法中調用。

轉載于:https://www.cnblogs.com/qiengo/archive/2012/05/26/2519168.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Android Load Picture Asynchronously的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黑丝av在线| 涩涩小网站 | 国内免费毛片 | 欧美黄色录像视频 | 欧美日韩a | 亚洲在线观看一区二区 | 黄色片子看看 | 成人深夜福利 | 少妇在线播放 | 中字幕视频在线永久在线观看免费 | 亚洲激情午夜 | 亚洲伦理一区二区 | 中文字幕福利 | 性开放耄耋老妇hd | 亚洲一区二区免费电影 | 免费观看成人 | 中文字幕精品一二三四五六七八 | 国产嫩草在线 | 日韩国产在线观看 | 久久精品在线播放 | 日本精品视频在线 | 国产在线观看中文字幕 | 91av观看| 国产白丝喷水 | 一级做a爰 | 在线免费看mv的网站入口 | 97久久免费视频 | 男人舔女人下部高潮全视频 | 免费的黄色一级片 | 精品熟妇无码av免费久久 | 免费看国产曰批40分钟 | 黄色av三级| 看av免费毛片手机播放 | 欧洲精品一区二区三区久久 | 亚洲av少妇一区二区在线观看 | 欲色网站| 中文字幕人妻熟女人妻a片 麻豆91视频 | 这里只有精品66 | 国产jjizz一区二区三区视频 | 麻豆av网址| 欧美五月激情 | 日本一区二区三区精品 | 中国久久久 | 国产精品911 | 国产一区免费看 | 日韩美女一级片 | 亚洲高清久久 | 今天高清视频在线观看视频 | 午夜毛片视频 | 特级淫片裸体免费看 | 少妇中文字幕 | 国内精品偷拍 | 四虎永久在线精品免费网址 | 国产山村乱淫老妇女视频 | 永久免费在线 | 制服丝袜影音先锋 | 中文一二区| 91a视频| 日韩有码一区 | 亚洲成a人片在线 | 日本性猛交 | 天堂一区在线观看 | 无码播放一区二区三区 | 激情三区 | 免费草逼视频 | 中文字幕av日韩 | 国产黄a | 中文字幕在线官网 | 精品一区二区在线免费观看 | xxxx国产| 日批黄色 | 日韩人妻无码精品久久免费 | 中文字幕乱码一区二区 | 天天曰天天爽 | 免费在线观看av | 国产大片中文字幕 | 黄色永久免费网站 | 欧美日韩网址 | 久久久久久久亚洲av无码 | 国产在线无 | 操碰视频在线 | 黄色片xxxx| 秋霞欧美视频 | 国产成人自拍网站 | 青青草国产在线观看 | 国产91在线精品 | 精品国自产拍在线观看 | 午夜三级在线观看 | 超碰视屏| 91精品在线观看视频 | 国产孕妇孕交大片孕 | 日韩欧美综合久久 | av片免费| 亚洲欧美色视频 | 国模一区二区 | 国产成人无码av在线播放dvd | 蜜桃91麻豆精品一二三区 | 日本成人在线视频网站 | 国产无遮挡裸体免费视频 |