看到一些文章WeakReference弱引用很多時(shí)候幫我們解決內(nèi)存泄露問(wèn)題
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)槲覀冊(cè)谡{(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í)上面兩種凡是都是有問(wèn)題的
- Activity activity = weakReference.get(); 其實(shí)已經(jīng)使弱引用失去了作用在最開(kāi)始的例子中已指明
- weakReference.get().doSomething(); 可能會(huì)出現(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)存被釋放將返回空
綜上所述弱引用不能解決線程中對(duì)activity操作引起的內(nèi)存泄露問(wèn)題
如有問(wèn)題歡迎討論