在非UI线程中处理Bitmap
生活随笔
收集整理的這篇文章主要介紹了
在非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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更有效的加载较大的Bitmap
- 下一篇: 二维码的扫描与制作