概要
AsyncTaskLoaderの実行後に実行したアクティビティのonStartがコールされると実行したAsyncTaskLoaderのonStartLoaderがコールされてloadInBackgroundが実行されてしまう。
解決法
onStartLoaderでloadInBackgroundが意図しないタイミング実行されないようにフラグで制御する
サンプルコード
public class SampleAsyncTaskLoader extends AsyncTaskLoader<Boolean>
{
/**
* タスク開始フラグ
*/
private boolean mIsStarted;
/**
* コンストラクタ
*/
public SampleAsyncTaskLoader(Context context)
{
super(context);
// タスク開始フラグを立てる
this.mIsStarted = true;
}
@Override
public Boolean loadInBackground()
{
〜バックグラウンド処理〜
// タスク開始フラグを下ろす
this.mIsStarted = false;
return true;
}
@Override
protected void onStartLoading()
{
// タスク開始フラグが立っていれば、バックグラウンド処理を実行する
if(mIsStarted == false)
{
return;
}
forceLoad();
}
}
onLoadFinishedでgetLoaderManager().destroyLoaderを呼び出す。
サンプルコード
@Override
public Loader<Boolean> onCreateLoader(int id, Bundle args)
{
return new SampleAsyncTaskLoader(this);
}
@Override
public void onLoadFinished(Loader<Boolean> loader, Boolean data)
{
〜処理〜
getLoaderManager().destroyLoader(loader.getId());
// または
// getSupportLoaderManager().destroyLoader(loader.getId());
}
@Override
public void onLoaderReset(Loader<Boolean> loader){}
参照
initLoader()とrestartLoader()のどちらを使うか
AsyncTaskLoaderのあるActivityに戻ってきたときに再度loadInBackgroundが呼ばれる問題
AsyncTaskLoaderを4ヶ月常用してみて