Android 弱引用和软引用

来源:互联网 发布:python图形界面生成exe 编辑:程序博客网 时间:2024/06/06 07:28
软引用 和 弱引用   

    1.  SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法。

    2.  WeakReference<T>:弱引用-->随时可能会被垃圾回收器回收,不一定要等到虚拟机内存不足时才强制回收。要获取对象时,同样可以调用get方法。

    3. WeakReference一般用来防止内存泄漏,要保证内存被虚拟机回收,SoftReference多用作来实现缓存机制(cache);

 

实例  SoftReference

如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

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

package com.stevenhu.lit;import java.lang.ref.SoftReference;import java.net.URL;import java.util.HashMap;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Handler;import android.os.Message;//实现图片异步加载的类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(){@Overridepublic 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 exceptionthrow new RuntimeException(e);}}}

    

弱引用(WeakReference) 

只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 

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

  Handler 弱引用,防止内存泄漏

package rxnet.zyj.com.myapplication;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import java.lang.ref.WeakReference;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            }        }    }}

  

 

原创粉丝点击