Weakreference get() method how safe is it? (Android, asynctask)

后端 未结 2 1561
你的背包
你的背包 2021-02-06 00:19

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() g

相关标签:
2条回答
  • 2021-02-06 00:40

    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);
                }
    
            }
        }
    }
    

    ```

    0 讨论(0)
  • 2021-02-06 00:42

    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.

    0 讨论(0)
提交回复
热议问题