在活动获取数据后显示片段

时间:2015-01-30 07:50:48

标签: android android-fragments android-asynctask asynctaskloader

我在我的活动中获取了几个片段所需的数据。返回数据后,我创建了片段。我通过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。

1 个答案:

答案 0 :(得分:0)

MVC 模型 - 查看 - 控制器)的观点来看,Activity及其片段是 Controller ,而 Model 应该负责加载数据。对于 View ,它由布局xml定义,您可以定义自定义View类,但通常不会。

所以创建一个 Model 类。 模型负责屏幕转弯时必须存活的内容。 (可能,它将是一个静态单例;注意Android可以杀死并重新创建进程,因此单例可能被设置为null。)请注意Activities use Bundles to send data to themselves in the future