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

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

   Integer integer = new Integer(1);     
   WeakReference weakReference = new WeakReference(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 weakReference;

public XmlTask(Activity activity){
     weakReference = new WeakReference(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操作引起的内存泄露问题

如有问题欢迎讨论

你可能感兴趣的:(android弱引用真的能解决内存泄露吗?)