Edited at

AsyncTaskLoaderのあるActivityに戻ってきたときに再度loadInBackgroundが呼ばれる問題

More than 3 years have passed since last update.


概要

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()のどちらを使うか

http://d.hatena.ne.jp/Kyakujin/20130528/1369729549


AsyncTaskLoaderのあるActivityに戻ってきたときに再度loadInBackgroundが呼ばれる問題

http://blog.loadlimits.info/2012/09/asynctaskloader%E3%81%AE%E3%81%82%E3%82%8Bactivity%E3%81%AB%E6%88%BB%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%86%8D%E5%BA%A6loadinbackground%E3%81%8C%E5%91%BC%E3%81%B0/


AsyncTaskLoaderを4ヶ月常用してみて

http://blog.nkzn.info/entry/20120514/1336979844