0

リスト項目をタップすると、詳細セクションが新しく選択された行に関連するデータをロードするリスト/詳細ワークフローを実装しようとしています。AsyncTaskLoaderこれを達成するためにを使用しようとしています。3 つのリスト項目を続けて十分にすばやくタップすると、実際には 2 つのロードだけが行われ、3 つ目が失われるという問題が発生しています。

この動作を示すサンプル アクティビティを作成しました。ボタンを 3 回タップすると、loadInBackground()メソッドは 2 回しか呼び出されません。どこかで電話に出られないのですか?

public final class LoaderActivity extends Activity implements LoaderManager.LoaderCallbacks<Integer> {

    private Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loader);

        button = (Button) findViewById(R.id.load_button);

        getLoaderManager().initLoader(0, null, this);
    }

    public void onButtonClick(View source) {
        Loader<Integer> loader = getLoaderManager().getLoader(0);
        if (loader != null) {
            loader.forceLoad();
        }
    }

    @Override
    public Loader<Integer> onCreateLoader(int id, Bundle args) {
        return new IntLoader(this);
    }

    @Override
    public void onLoadFinished(Loader<Integer> listLoader, Integer data) {
        button.setText(String.valueOf(data));
    }

    @Override
    public void onLoaderReset(Loader<Integer> listLoader) {

    }

    private static final class IntLoader extends AsyncTaskLoader<Integer> {

        private static final AtomicInteger counter = new AtomicInteger(0);

        IntLoader(Context context) {
            super(context);
        }

        @Override
        public Integer loadInBackground() {
            int result = counter.getAndIncrement();

            // Simulate a potentially expensive web call
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {

            }

            return result;
        }

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

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

        @Override
        public void deliverResult(Integer data) {
            if (isStarted()) {
                super.deliverResult(data);
            }
        }

    }

}
4

1 に答える 1

0

restartLoader(0, null, this)メソッドの代わりに呼び出すことでgetLoader(0)onButtonClick()この問題は解決したようです。sについてさらに学習してLoaderいると、その時点で古い結果を破棄したいので、呼び出すのがより適切なメソッドのように思えます。

于 2012-07-17T03:27:18.033 に答える