リスト項目をタップすると、詳細セクションが新しく選択された行に関連するデータをロードするリスト/詳細ワークフローを実装しようとしています。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);
}
}
}
}