看到一些文章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
其实上面两种凡是都是有问题的
- Activity activity = weakReference.get(); 其实已经使弱引用失去了作用在最开始的例子中已指明
- 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操作引起的内存泄露问题
如有问题欢迎讨论
网友评论