【发布时间】:2014-11-30 22:54:10
【问题描述】:
在活动的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);
// ...
}
但是,有时我的应用会因此崩溃:
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:415)
at com.mypackage.MainActivity.access$9(MainActivity.java:1358)
at com.mypackage.MainActivity$InitTask.onPostExecute(MainActivity.java:1)
第 1358 行正是这一行:
private void updateUi(Bundle savedInstanceState) {
所以,WeakReference(模式)并没有让我免于将AsyncTask 的结果返回到不同的 MainActivity。
在这种情况下,最好的方法是什么? ServiceIntent?
【问题讨论】:
-
弱引用不会阻止任何东西被GCed,但它与这种情况无关。 Activity 被销毁的事实与它的生命周期有关。您可能希望绑定到活动中的服务,或者如果活动被破坏,则简单地忽略异步任务的结果。当您的活动暂停时,可能在 AsyncTask 上调用
cancel。 -
可能与这里的问题相同:stackoverflow.com/questions/15207305/…
标签: android android-asynctask weak-references illegalstateexception