2014年2月23日日曜日

Android - AsyncTaskLoaderが何度も呼ばれる

AsyncTaskLoaderを使用していて、意図しないタイミングで何度も実行されていたので、この方法が正しいのかどうかは、また分かっていないのですが、とりあえず、一度だけ実行するように修正したので、メモ。

public class TestFragment extends Fragment {

    private static final int ID = 0;
    private LoaderManager mLoaderManager;

    public TestFragmen() {}

    LoaderManager.LoaderCallbacks<D> testCallbacks = new LoaderManager.LoaderCallbacks<D>() {

        @Override
        public void onLoadFinished(Loader<d> loader, D data) {;
            mLoaderManager.destroyLoader(ID);
        }
    };

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mLoaderManager = getLoaderManager();
        mLoaderManager.initLoader(ID, null, testCallbacks);
    }

}

ポイントは、onLoadFinished()で、LoaderManager#destroyLoader()を呼び出しているところです。
このLoaderManager#destroyLoader()が呼び出されると、Loader#onReset()が呼び出されるので、その中で、停止処理を行ってあげれば、終了してくれます。

public class TestLoader extends AsyncTaskLoader {

    @Override
    protected  void onStopLoading() {
        cancelLoad();
    }

    @Override
    protected  void onReset() {
        super.onReset();
        onStopLoading();
    }

}

とりあえず、こんなところかな。


参考サイト:
LoaderManager | Android Developers

0 件のコメント:

コメントを投稿