在非UI线程中处理Bitmap
譯文出自谷歌安卓官網(wǎng)
BitmapFactory.decode*方法不能在UI線程中執(zhí)行。因?yàn)榧虞d這些圖片所花費(fèi)的時間是不可預(yù)知的,取決于各種各樣的因素(從磁盤或網(wǎng)絡(luò)上的加載速度,圖片的大小,CPU的性能等等)。如果圖片加載任務(wù)阻塞了UI線程,系統(tǒng)會為你的應(yīng)用程序標(biāo)記一個ANR,并且你可以選擇關(guān)閉你的應(yīng)用程序。
本課程引導(dǎo)你進(jìn)入使用AsyncTask作為背景線程來處理圖片加載任務(wù),并且向你展示如何處理并發(fā)問題
使用AsyncTask
這個AsyncTask類提供了一個背景執(zhí)行工作和將執(zhí)行結(jié)果發(fā)布到UI線程中。要想使用AsyncTask,你得創(chuàng)建一個基類并重寫其方法。
如下使用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回收。當(dāng)任務(wù)結(jié)束的時候,無法保證ImageView仍然在當(dāng)前任務(wù)中,因此在onPostExecute( )中你必須檢查ImageView的索引。例如,當(dāng)用戶從這個界面離開或者任務(wù)結(jié)束前配置發(fā)生了改變,這些會導(dǎo)致ImageView不存在,
開始異步加載Bitmap,并執(zhí)行它
public void loadBitmap(int resId, ImageView imageView) {BitmapWorkerTask task = new BitmapWorkerTask(imageView);task.execute(resId); }總結(jié)
以上是生活随笔為你收集整理的在非UI线程中处理Bitmap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更有效的加载较大的Bitmap
- 下一篇: 二维码的扫描与制作