您好,欢迎来到华拓网。
搜索
您的当前位置:首页android弱引用真的能解决内存泄露吗?

android弱引用真的能解决内存泄露吗?

来源:华拓网

看到一些文章WeakReference弱引用很多时候帮我们解决内存泄露问题

   Integer integer = new Integer(1);     
   WeakReference<Integer> weakReference = new WeakReference<Integer>(integer);
   Integer teo= weakReference.get();     
   integer=null;       
   System.gc();   
   if(teo==null){        
    Log.d("msg","不是强引用");      
   }else {         
    Log.d("msg","是强引用");    
  }

如上述代码
最终结果是

是强引用

因为我们在调用该代码Integer teo= weakReference.get(); 已使弱引用失去了作用转为了强引用

在看下面的例子 伪代码

private class XmlTask extends AsyncTask{

WeakReference<Activity> weakReference;

public XmlTask(Activity activity){
     weakReference = new WeakReference<Activity>(activity);
}

protected void doInBackground(String... params) {
 //方式1   Activity activity = weakReference.get(); 
    Activity activity = weakReference.get(); 
   if(activity!=null){
       activity.doSomething();
   }


//方式 2.  weakReference.get(); 
   if(weakReference.get() != null) {
       weakReference.get().doSomething();
   }
}

@Override
 void onPostExecute() {
}

上面的例子举出了两种实现方式在doInBackground中操作activity
其实上面两种凡是都是有问题的

  1. Activity activity = weakReference.get(); 其实已经使弱引用失去了作用在最开始的例子中已指明
  2. weakReference.get().doSomething(); 可能会出现空指针异常

/** * Returns the referent of the reference object. * * @return the referent to which reference refers, or {@code null} if the * object has been cleared. */
public T get() { return getReferent();}

如果内存被释放将返回空

综上所述弱引用不能解决线程中对activity操作引起的内存泄露问题

如有问题欢迎讨论

Copyright © 2019- huatuo3.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务