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操作引起的内存泄露问题

如有问题欢迎讨论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容