Android 软引用和弱引用

11 篇文章 0 订阅

如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

 

比如在图片加载框架中,通过弱引用来实现内存缓存。

 

//实现图片异步加载的类

public class AsyncImageLoader{

    //以Url为键,SoftReference为值,建立缓存HashMap键值对。

    private Map<String, SoftReference<Drawable>> mImageCache =

        new HashMap<String, SoftReference<Drawable>>();

    

    //实现图片异步加载

    public Drawable loadDrawable(final String imageUrl, final ImageCallback callback){

        //查询缓存,查看当前需要下载的图片是否在缓存中

        if(mImageCache.containsKey(imageUrl)) {

            SoftReference<Drawable> softReference = mImageCache.get(imageUrl);

            if (softReference.get() != null){

                return softReference.get();

            }

        }

        

        final Handler handler = new Handler() {

            @Override

            public void dispatchMessage(Message msg){

                //回调ImageCallbackImpl中的imageLoad方法,在主线(UI线程)中执行。

                callback.imageLoad((Drawable)msg.obj);

            }

        };

        

        /*若缓存中没有,新开辟一个线程,用于进行从网络上下载图片,

         * 然后将获取到的Drawable发送到Handler中处理,通过回调实现在UI线程中显示获取的图片

         */

        new Thread(){     

            public void run() {

                Drawable drawable = loadImageFromUrl(imageUrl);

                //将得到的图片存放到缓存中

                mImageCache.put(imageUrl, new SoftReference<Drawable>(drawable));

                Message message = handler.obtainMessage(0, drawable);

                handler.sendMessage(message);

            };

        }.start();

        

        //若缓存中不存在,将从网上下载显示完成后,此处返回null;

        return null;

    }

    

    //定义一个回调接口

    public interface ImageCallback{

        void imageLoad(Drawable drawable);

    }

    //通过Url从网上获取图片Drawable对象;

    protected Drawable loadImageFromUrl(String imageUrl){

        try {

            return Drawable.createFromStream(new URL(imageUrl).openStream(),"debug");

        } catch (Exception e) {

            // TODO: handle exception

            throw new RuntimeException(e);

        }

    }

}

    

弱引用(WeakReference)

如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

WeakReference<User> sr = new WeakReference<User>(new User());

  Handler 弱引用,防止内存泄漏

 

public class MainActivity extends AppCompatActivity {

 

    private Handler handler  ;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        handler = new MyHandler( this ) ;

 

        new Thread(new Runnable() {

            @Override

            public void run() {

               handler.sendEmptyMessage( 0 ) ;

            }

        }).start() ;

    }

 

    private static class MyHandler extends Handler {

        WeakReference<MainActivity> weakReference ;

 

        public MyHandler(MainActivity activity ){

            weakReference  = new WeakReference<MainActivity>( activity) ;

        }

 

        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            if ( weakReference.get() != null ){

                // update android ui

            }

        }

    }

}

  

弱引用与软引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值