0

我正在尝试实现一个列表/详细信息工作流程,其中点击列表项会导致详细信息部分加载与新选择的行相关的数据。我正在尝试使用 anAsyncTaskLoader来完成此操作。我遇到了一个问题,如果我连续足够快地点击三个列表项,实际上只会发生两个负载,而第三个会丢失。

我编写了一个示例活动来演示这种行为。当点击按钮三次时,该loadInBackground()方法只会被调用两次。我在某个地方错过了一个电话吗?

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)而不是似乎已经解决了这个问题。随着我对s 的更多了解,这听起来像是更合适的调用方法,因为我当时想丢弃任何旧结果。getLoader(0)onButtonClick()Loader

于 2012-07-17T03:27:18.033 回答