首页 > 其他 > 详细

后台执行Bitmap加载

时间:2017-02-10 23:20:31      阅读:285      评论:0      收藏:0      [点我收藏+]

如果加载图片时,使用的图片数据源不是来自于内存,而是来自硬盘或网络时,一般不会再UI线程执行图片加载操作。

图片的加载速度取决于很多方面(往往具有不可预测性),比如:硬盘或者网络的读写速度、图片大小、CPU执行速度等待...

如果在UI线程执行图片加载操作,很可能会导致ANR。

因此,可以在后台执行图片加载操作。

方法一:使用AsyncTask执行后台图片加载

    public 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);
        }
        @Override
        protected Bitmap doInBackground(Integer... params) {
            // 图片资源ID
            data = params[0];
            // 局限性在于:调用了getResources()
            return UtilTools.decodeSampleBitmatFromResource(getResources(),
                    data, 100, 100);
        }
        @Override
        protected void onPostExecute(Bitmap result) {
            if (imageViewReference != null && result != null) {
                final ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageBitmap(result);
                }
            }
        }
    }

其中,doInBackground()在子线程(background Thread)中执行,onPostExecute()则是在UI线程执行。

    /**
     * <功能描述> 执行加载Bitmap
     * 
     * @param resId 资源ID
     * @param imageView [参数说明] 控件
     * @return void [返回类型说明]
     */
    private void loadBitmap(int resId, ImageView imageView) {
        BitmapWorkerTask task = new BitmapWorkerTask(imageView);
        task.execute(resId);
    }

执行 task.execute(resId) 时,其参数实际上是Params。

上述即实现了,状态后台线程中加载Bitmap,并在加载完成后显示到UI上的功能。

后台执行Bitmap加载

原文:http://www.cnblogs.com/CVstyle/p/6388095.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!