2011-08-13 39 views
10

我正在制作Android移动应用程序。我在AsyncTask中为我的活动添加了一个WeakReference,以确保它可以被垃圾回收。Weakreference get()方法有多安全? (Android,asynctask)

onPostExecute()被调用,我

Acitivty activity = mWeakRef.get(); 

然后我用的是活动对象,以显示对话框向用户等等等等

我的问题是,因为我试图确定哪个对话框显示和做什么,我的活动对象可以变为空?如果GC在我的执行线之间运行,它会变成空吗?我可以安全地继续使用第一个get()中的对象,或者我必须重做get()并在我使用它之前检查值是否为null。

谢谢!

回答

9

很安全!
只要将get()的结果赋值给一个变量,只要新引用存在,您就会再次获得一个强引用,该引用会阻止此对象的gargbage收集。
当然,在此作业之后,您需要检查活动是否为空。

-1

我认为这是不安全的。我在Handler的activity.msgWebView.setVisibility(View.GONE);处得到NPE。

```Java的

私有静态类的httpStatusHandler扩展了Handler {

private WeakReference<MessageWebViewActivity> activityWeakReference; 

    public HttpStatusHandler(WeakReference<MessageWebViewActivity> activityWeakReference) { 
     this.activityWeakReference = activityWeakReference; 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     MessageWebViewActivity activity = activityWeakReference.get(); 
     if (activity != null) { 
      if (msg.what == MSG_URL_OK) { 
       activity.loadUrl(activity.url); 
      } else if (msg.what == MSG_URL_ERROR) { 
       activity.msgWebView.setVisibility(View.GONE); 
       activity.clPageError.setVisibility(View.VISIBLE); 
       activity.progressbarLayout.setVisibility(View.GONE); 
      } 

     } 
    } 
} 

```