我在我的活动中获取多个片段所需的数据。返回数据后,我创建片段。我是通过 AsyncTask 执行此操作的,但如果在屏幕旋转后返回数据或应用程序在后台运行,它会导致偶尔崩溃。
我阅读并认为解决方案是使用 AsyncTaskLoader。假设如果您的活动消失了,它不会回调,因此应该解决这些错误。但这现在每次都会崩溃,因为“无法在 onLoadFinished 内执行此操作(添加片段)”。
我该怎么处理这个?我不希望我的每个片段都必须获取数据,所以看起来活动是放置代码的正确位置。
谢谢!
编辑 1
这是相关的代码。我认为问题不在于代码本身,而在于我的整个方法。例外很明显,我不应该创建片段。我只是不确定如何做到这一点。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportLoaderManager().initLoader(BREWERY_LOADER, null, this).forceLoad();
}
//================================================================================
// Loader handlers
//================================================================================
@Override
public Loader<Brewery> onCreateLoader(int id, Bundle args) {
int breweryId = getIntent().getIntExtra(EXTRA_BREWERY_ID, -1);
return new BreweryLoader(this, breweryId);
}
@Override
public void onLoadFinished(Loader<Brewery> loader, Brewery data) {
if (data != null) {
onBreweryReceived(data);
} else {
onBreweryError();
}
}
@Override
public void onLoaderReset(Loader<Brewery> loader) {
}
...
protected void onBreweryReceived(Brewery brewery) {
...
createFragments();
}
...
protected void createFragments() {
FragmentManager fm = getSupportFragmentManager();
//beers fragment
mBeersFragment = (BreweryBeersFragment)fm.findFragmentById(R.id.beersFragmentContainer);
if (mBeersFragment == null) {
mBeersFragment = new BreweryBeersFragment();
fm.beginTransaction()
.add(R.id.beersFragmentContainer, mBeersFragment)
.commit();
Bundle beersBundle = new Bundle();
beersBundle.putInt(BreweryBeersFragment.EXTRA_BREWERY_ID, mBrewery.getId());
mBeersFragment.setArguments(beersBundle);
}
}
编辑 2
我的新策略是使用带有 ResultReceiver 的 IntentService。我在 onPause 中取消了回调,因此不存在我的活动在不应该被击中的危险。这感觉比必要的要笨重得多,但是 AsyncTask 和 AsyncTaskLoader 似乎都没有我需要的一切。在这些回调方法中创建片段似乎也不会打扰 Android。