码迷,mamicode.com
首页 > 移动开发 > 详细

WeakReference在Android中的使用

时间:2015-08-28 19:53:50      阅读:382      评论:0      收藏:0      [点我收藏+]

标签:android   ui   asynctask   弱引用   


弱引用(WeakReference)

  • 用于非必需对象。被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

1. 非UI线程处理Bitmap(可以替换为其它对象)

以下摘自官网

class BitmapWorkerTask extends AsyncTask {
    private final WeakReference imageViewReference; //注意用了final
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView) {
        // 使用WeakReference确保ImageView能被回收
        imageViewReference = new WeakReference(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        data = params[0];
        return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
    }

    // 完成后,看ImageView是否仍还在,在UI中更新.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

2. 管理Activity与Handler通信

以下为本人项目中的代码片段,完整代码

//用静态内部类来防止持有外部类的隐性引用
    static class WeakReferenceHander extends Handler {
        //把Acitivity用WeakReference管理起来
        private final WeakReference<ShareUploadActivity> mActivity;

        public WeakReferenceHander(ShareUploadActivity activity) {
            mActivity = new WeakReference<ShareUploadActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            if (mActivity.get() != null) {
               mActivity.get().handleReceiveMessage(msg);
            }
        }
    }

如果不用这种方式,请考虑,若一个子线程执行一个较耗时操作(运行未结束),此时UI线程finish()掉,但是GC无法对其回收,因为存在Handler的引用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

WeakReference在Android中的使用

标签:android   ui   asynctask   弱引用   

原文地址:http://blog.csdn.net/u012951554/article/details/48055939

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!