CursorLoader
を使用してウィジェットを画面に埋め込む方法を知りたい。すべてのオンラインの例は、アダプタを使用するためだけであり、これは素晴らしいです。私が必要とするのは、画面内のビューをカーソルとUIスレッド上で更新する信頼できる方法です。StaleDataException
またはカーソルが突然すべて非アクティブになるために時々クラッシュすることはありません。ここに私の現在のアプローチがありますが、私はまだユーザーからいくつかのクラッシュレポートを受け取ります。onLoadFinished()内のカーソルからウィジェットを取り込む
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
CursorLoader loader = null;
switch (id) {
case LOADER_ID_DATA:
loader = new CursorLoader(...);
break;
}
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, final Cursor cursor) {
handler.post(new Runnable() {
@Override
public void run() {
if (getActivity() == null)
return;
updateView(cursor);
}
});
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
}
一つの解決策は、onLoadFinished内に直接、すべてのカーソルのフィールドを取得し、UIスレッド上でウィジェットを移入するハンドラにそれらをすべて渡すことであろう。しかし、これは私がカーソルに多くの値を持つ可能性があるため、醜いです。私はこのすべてを扱う信頼性の高いクラッシュフリーな方法を見つけることが大好きです。
"onLoadFinished内のすべてのカーソルフィールドを直接取得し、それらをすべてハンドラに渡してUIスレッドにウィジェットを設定することです。" - onLoadFinished()はメインアプリケーションスレッドで呼び出されます。 – CommonsWare
@CommonsWare私の知る限り、onLoadFinishedはメインのUIスレッドでは呼び出されません。 Reto Meierによって書かれたandroid-protips_locationのソースコードを見てみると、彼はハンドラを使ってウィジェットに値を入力します。 onLoadFinished()の上の彼のコメントは、彼がメインアプリケーションスレッドの更新をスケジュールすることです。 –
Reto Meierからの引用:「onLoadFinishedはメインのアプリケーションスレッドと同期していないので、Cursorがロードされたときと同じスレッドでCursor値を抽出してから、新しいRunnableをUIスレッドにポストする値をUI要素に返す " –