0

いくつかのフラグメントで必要なアクティビティでデータを取得しています。データが返されたら、フラグメントを作成します。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 でコールバックを null にするので、アクティビティがヒットしてはならないときにヒットする危険がありません。これは必要以上に手間がかかるように感じますが、AsyncTask と AsyncTaskLoader には必要なものがすべて揃っているようには見えませんでした。これらのコールバック メソッドでフラグメントを作成しても、Android には問題がないようです。

4

1 に答える 1

0

MVC ( Model -- View -- Controller ) の観点からは、 Activity とそのフラグメントの両方がControllerであり、データのロードを担当するのはModelです。Viewに関しては、レイアウト xml によって定義されます。カスタム View クラスを定義できますが、通常は定義できません。

そのため、 Modelクラスを作成します。モデルは、スクリーン ターンを生き延びなければならないものに対して責任があります。(おそらく、これは静的なシングルトンになります。Android はプロセスを強制終了して再作成できるため、シングルトンが null に設定される可能性があることに注意してください。)アクティビティはバンドルを使用して、将来自身にデータを送信することに注意してください。

于 2015-01-30T08:44:44.847 に答える