3

リストビューをサポートするクエリを処理するために LoaderManager を使用しています。ただし、プロセスの後半までわからないいくつかのパラメーターに依存しています。現在、私は電話しています

getSupportLoaderManager().initLoader(0, null, callback);

onCreate() 内。これにより、パラメーターがすべて認識される前に、ローダーがすぐに作成され、クエリが実行されます。これを処理するために、すべてのパラメーターが不明な場合に onCreateLoader() にダミーのクエリを用意し、正当なクエリがあるかどうかを onLoadFinished() 内でチェックするコールバック ハンドラーにフラグを設定します。そうでない場合は、カーソル データを無視します。実際のクエリを実行するときが来たら、私は呼び出します

getSupportLoaderManager().restartLoader(0, null, callback);

また、 onLoadFinshed() が適切に処理できるように、フラグを true に設定します。

私が上でやっていることはちょっとハッキーに思えます。より良い方法はありますか?最初にクエリが必要になったときに、最初に initLoader() を呼び出そうとしましたが、この質問と同様に、向きが変わると失敗します。

4

4 に答える 4

0

質問を閉じるために、私のユースケースでは、フラグメントごとのローダーマネージャーを使用して、必要なときにそれらをインスタンス化し、情報を入手することができました。これが他の人のユースケースに合わない場合、AsyncTasksの記述を避け、ローダーの組み込み機能の一部を利用したいのであれば、おそらく私の元のハックで十分です。

于 2012-04-17T06:50:34.350 に答える
0

restartLoader最初に電話をかけずに、単に電話をかけることができますinitLoaderinitLoaderから呼び出しを削除し、パラメーターを取得したらonCreate実行するだけです。フラグは必要ありません。restartLoader

于 2012-04-05T01:18:09.700 に答える
0

私は別のもっと簡単な解決策を見つけました。何らかの理由で、onCreate() で initLoader() を呼び出す必要がありますが、restartLoader() を呼び出すたびに LoaderCallbacks を渡す必要があるため、initLoader() へのこの最初のダミー呼び出しでどのコールバックを使用するかは問題ではありません。 )。非常に単純なユーティリティ メソッドを作成しました。

public static void initEmptyLoaders(Activity activity, int... ids) {
    initEmptyLoaders(activity, activity.getLoaderManager(), ids);
}

public static void initEmptyLoaders(final Context ctx, LoaderManager loaderManager, int... ids) {
    LoaderManager.LoaderCallbacks callbacks = new LoaderManager.LoaderCallbacks() {
        @Override
        public Loader onCreateLoader(int i, Bundle bundle) {
            return new Loader(ctx);
        }

        @Override
        public void onLoadFinished(Loader loader, Object o) {
        }

        @Override
        public void onLoaderReset(Loader loader) {
        }
    };

    for (int id : ids) {
        loaderManager.initLoader(id, null, callbacks);
    }
}

今、私は onCreate() で initEmptyLoaders() を呼び出し、後で必要になる可能性のあるすべてのローダー ID を指定します - すべてが機能します :-)

于 2013-01-17T08:04:16.707 に答える