2011-08-13 38 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); 
      } 

     } 
    } 
} 

```