8

カスタムAsyncTaskLoaderを使用して Web サービスからデータをダウンロードする場合、読み込みプロセスの途中で HOME ボタンを押して再度アプリに入ると、onLoadFinished() メソッドが呼び出されません。私のフラグメントが呼び出しsetRetainInstance(true)ており、同じメソッドonActivityCreated()でも呼び出します(推奨)。getLoaderManager.initLoader(0, null, this)

テスト中に、フラグメントに戻ったときに呼び出されないことがわかりました。onActivityCreated()これが呼び出されない理由かもしれonLoadFinished()ません。initLoader()しかし、メソッドを他にどこに置くのでしょうか? で呼び出すべきではないことをいくつかの場所で読みましたonResume()

それで、何かアイデアはありますか?アプリのさまざまな画面に多数のローダーがあり、この問題をエレガントな方法で解決する必要があります。

4

1 に答える 1

22

Issue 14944(http://code.google.com/p/android/issues/detail?id=14944onStartLoading() )を見た後、カスタムをオーバーライドしてAsyncTaskLoaderを呼び出すことで問題を解決しましたforceLoad()

さらに良い解決策は、次のようなカスタムの親を作成することですAsyncTaskLoader(上記のリンクからのalexvemによる提案から取得)。

public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> {

    private D data;

    public AsyncLoader(Context context) {
        super(context);
    }

    @Override
    public void deliverResult(D data) {
        if (isReset()) {
            // An async query came in while the loader is stopped
            return;
        }

        this.data = data;

        super.deliverResult(data);
    }


    @Override
    protected void onStartLoading() {
        if (data != null) {
            deliverResult(data);
        }

        if (takeContentChanged() || data == null) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
         // Attempt to cancel the current load task if possible.
        cancelLoad();
    }

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

        // Ensure the loader is stopped
        onStopLoading();

        data = null;
    }
}
于 2011-09-20T08:05:12.553 に答える