10

I am making an Android mobile app. I have a WeakReference to my Activity in the AsyncTask to ensure that it can be garbage collected.

When onPostExecute() gets called, I do

Acitivty activity = mWeakRef.get();

Then I use the activity object to display dialogs to the user etc etc.

My question is, as I am trying to determine which dialog to show and what to do, could my activity object become null? Could it ever become null if the GC runs in between my line of execution? Am I safe to keep using that object from the first get() or do I have to redo get() and check if the value is null right before I use it.

thanks!

dnkoutso
  • 6,041
  • 4
  • 37
  • 58

2 Answers2

10

It's safe!
As soon as you assign the result of get() to a variable, you have a strong reference again which blocks gargbage collection for this object as long as the new reference exists.
Of course, after this assignment you need to check if activity is null.

didi_X8
  • 5,018
  • 10
  • 42
  • 46
-2

I think it's NOT safe. I get a NPE at activity.msgWebView.setVisibility(View.GONE); inside Handler.

```java

private static class HttpStatusHandler extends 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);
            }

        }
    }
}

```

Ernest
  • 222
  • 2
  • 12