いくつかのフラグメントで必要なアクティビティでデータを取得しています。データが返されたら、フラグメントを作成します。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 には問題がないようです。