7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-05-25

概要

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ヶ月常用してみて

7
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?