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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在非UI线程中处理Bitmap

發布時間:2025/3/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在非UI线程中处理Bitmap 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

譯文出自谷歌安卓官網

BitmapFactory.decode*方法不能在UI線程中執行。因為加載這些圖片所花費的時間是不可預知的,取決于各種各樣的因素(從磁盤或網絡上的加載速度,圖片的大小,CPU的性能等等)。如果圖片加載任務阻塞了UI線程,系統會為你的應用程序標記一個ANR,并且你可以選擇關閉你的應用程序。

本課程引導你進入使用AsyncTask作為背景線程來處理圖片加載任務,并且向你展示如何處理并發問題


使用AsyncTask

這個AsyncTask類提供了一個背景執行工作和將執行結果發布到UI線程中。要想使用AsyncTask,你得創建一個基類并重寫其方法。

如下使用AsyncTask將圖片加載到ImageView中,并且使用了decodeSampledBitmapFromResource()的例子

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 collectedimageViewReference = new WeakReference<ImageView>(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);}}} }

這個對ImageView的WeakReference確保AsyncTask不會阻礙ImageView被GC回收。當任務結束的時候,無法保證ImageView仍然在當前任務中,因此在onPostExecute( )中你必須檢查ImageView的索引。例如,當用戶從這個界面離開或者任務結束前配置發生了改變,這些會導致ImageView不存在,

開始異步加載Bitmap,并執行它

public void loadBitmap(int resId, ImageView imageView) {BitmapWorkerTask task = new BitmapWorkerTask(imageView);task.execute(resId); }

總結

以上是生活随笔為你收集整理的在非UI线程中处理Bitmap的全部內容,希望文章能夠幫你解決所遇到的問題。

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