android弱引用真的能解決內(nèi)存泄露嗎?

看到一些文章WeakReference弱引用很多時候幫我們解決內(nèi)存泄露問題

   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","不是強(qiáng)引用");      
   }else {         
    Log.d("msg","是強(qiáng)引用");    
  }

如上述代碼
最終結(jié)果是

是強(qiáng)引用

因?yàn)槲覀冊谡{(diào)用該代碼Integer teo= weakReference.get(); 已使弱引用失去了作用轉(zhuǎn)為了強(qiáng)引用

在看下面的例子 偽代碼

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() {
}

上面的例子舉出了兩種實(shí)現(xiàn)方式在doInBackground中操作activity
其實(shí)上面兩種凡是都是有問題的

  1. Activity activity = weakReference.get(); 其實(shí)已經(jīng)使弱引用失去了作用在最開始的例子中已指明
  2. weakReference.get().doSomething(); 可能會出現(xiàn)空指針異常

/** * 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();}

如果內(nèi)存被釋放將返回空

綜上所述弱引用不能解決線程中對activity操作引起的內(nèi)存泄露問題

如有問題歡迎討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容