Android 即使使用了WeakReference,对已销毁活动的引用

Android 即使使用了WeakReference,对已销毁活动的引用,android,android-asynctask,weak-references,illegalstateexception,Android,Android Asynctask,Weak References,Illegalstateexception,在活动的onCreate中,我首先检查一些远程数据(如果尚未检查),然后更新UI: private static WeakReference<MainActivity> wrActivity = null; protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); wrActivity = new WeakReference<MainA

在活动的
onCreate
中,我首先检查一些远程数据(如果尚未检查),然后更新UI:

private static WeakReference<MainActivity> wrActivity = null;

protected void onCreate(final Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  wrActivity = new WeakReference<MainActivity>(this);
  // ...
}

private class InitTask extends AsyncTask<Object, Void, Bundle> {
  @Override
  protected Bundle doInBackground(Object... params) {
    // checking some (network) stuff

    return (Bundle) params[0];
  }

  @Override
  protected void onPostExecute(final Bundle savedInstanceState) {
    if (wrActivity.get() == null || wrActivity.get().isFinishing()) {
      return;
    }

    updateUi(savedInstanceState);
  }
}

private void updateUi(Bundle savedInstanceState) {
  Log.d(getClass().getSimpleName(), "updateUi()");

  if (savedInstanceState == null) {
    resetActionBar();
  }

  initPagerAndTabs(savedInstanceState);

  // ...
}

private void initPagerAndTabs(Bundle savedInstanceState) {
  Log.d(getClass().getSimpleName(), "initPagerAndTabs()");
  mTabNames = getResources().getStringArray(R.array.tabs);

  mAdapter = new FragmentAdapter(getSupportFragmentManager());
  mPager = (ViewPager) findViewById(R.id.pager);
  mPager.setAdapter(mAdapter);
  mPager.setOnPageChangeListener(mAdapter);
  // ...
}
1358行正好是一行:

private void updateUi(Bundle savedInstanceState) {
因此,
WeakReference
(模式)不会将我从
AsyncTask
返回结果到其他MainActivity中解救出来


在这种情况下,最好的方法是什么
ServiceIntent

在活动被GC’d之前,WeakReference不会被设置为null,而GC’d可能是在活动被销毁后的一段时间。在“isFinishing()”之后,添加对“isDestroyed()”的检查。这需要API级别17,所以您可能需要自己实现它(在onDestroy中设置为false的布尔字段)


另外,为了保持整洁,只需调用WeakReference.get()。从理论上讲,GC可以在两个调用之间运行,给您一个NullPointerException

您的私人非静态类初始化任务保留对您的活动的引用。
你可以阅读。

weakreference并不能阻止任何东西被GCD,但它与本案例无关。活动被破坏的事实与其生命周期有关。您可能希望绑定到活动中的服务,或者在活动被销毁时忽略asynctask的结果。当您的活动暂停时,可能会对AsyncTask调用
cancel
。可能与此处的问题相同:您关于调用
WeakReference.get()
的观点绝对正确。必须
get()
引用的对象,然后直接使用它。任何后续使用
WeakReference
都是对
NullPointerException
的邀请。。。这就是为什么链接到第三方网站比在这里粘贴相同的信息更不受鼓励的原因。@Saran,对不起,请再试一次,我已更改到文章的链接。
private void updateUi(Bundle savedInstanceState) {