6

CursorLoaderを使用して画面にウィジェットを配置する方法を知りたいです。オンラインのすべての例は、アダプターを使用するためだけのものであり、これはうまく機能します。私が必要としているのは、カーソルとUIスレッドから画面のビューを更新するための信頼できる方法でありStaleDataException、カーソルが突然非アクティブ化されたためにクラッシュすることはありません。これが私の現在のアプローチですが、それでもユーザーからクラッシュレポートを受け取ります。

@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) {
    }

1つの解決策は、onLoadFinished内で直接すべてのカーソルフィールドを取得し、それらすべてをハンドラーに渡して、UIスレッドにウィジェットを設定することです。しかし、カーソルに多くの値がある可能性があるため、これは醜いです。これらすべてに対処するための信頼できるクラッシュのない方法を見つけたいと思います。

4

1 に答える 1

7

#android-devに質問した後、私がこれの底をつかむのSimonVTreadme手伝ってくれました。

onLoadFinishedUIスレッドで呼び出されることを示すものは何もないので、理論的にHandlerは、Retoの本でアドバイスされているようなものを使用する必要があります。ただし、CursorLoader(これは最も一般的なユースケースです)を使用する場合onLoadFinished、UIスレッドで呼び出されることをほぼ保証できます。

于 2012-05-18T10:31:32.037 に答える