【问题标题】:WeakReference in AsyncTaskAsyncTask 中的弱引用
【发布时间】:2017-12-01 21:05:13
【问题描述】:

Activity 启动 AsyncTask,完成后,该任务需要检查该 Activity 是否被销毁并被垃圾回收。我认为 WeakReference 可以帮助我解决这个问题。但即使我旋转屏幕并且活动被破坏,我仍然不是空的。我做错了什么?

class MyAsyncTask extends AsyncTask<String,String,String> {

WeakReference<ActivitySecond> sactivity;
MyAsyncTask(ActivitySecond a)
{
    sactivity = new WeakReference<>(a);
}
@Override
protected String doInBackground(String... strings) {
    try {
        Thread.sleep(5000);
    }
    finally {
        return "Ok";
    }
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    if (sactivity!=null)
    {
        ActivitySecond activity =    sactivity.get();
        if (activity!=null)
            Toast.makeText(activity,s,Toast.LENGTH_LONG).show();
    }
}
}

【问题讨论】:

  • 它被销毁但不是 gc-ed

标签: java android android-asynctask


【解决方案1】:

如果除了弱引用之外没有其他对该对象的引用,则允许对该对象进行垃圾回收。

但不保证实际完成。

【讨论】:

  • 1.这段代码对吗? 2. 等到 GC 执行后我能做什么?
  • WeakReference 的使用看起来还不错。你在构造函数中设置它(我会让 sactivity 最终)。并且在使用对对象的引用之前进行空检查。您不需要对 sactivity 进行 nullcheck;除非您明确将其归零。但我不知道还有什么事情发生。在某些时候,GC 将垃圾收集该对象并将 WeakReference 中的引用设置为 null。你不能强迫它发生。
  • 我找到了另一个例子。当我在 ImageView GC 中加载大图像时,当我旋转屏幕时删除活动。你评论够了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多