21

ローダーに関して何か間違ったことをしているかどうかを把握しようとしています。私はサポート ライブラリを使用しており、onCreate() で initLoader() を呼び出してそれ自体を LoaderCallbacks として設定する Fragment がありますが、ローテーションでは、init を呼び出した結果として、onLoadFinished() で結果を 2 回受け取ります。 (そしてすでにデータを持っています)、そして一度 FragmentActivity が onStart() のすべてのローダーをループし、すでにデータを持っているので結果を配信した結果として。

init を 1 回だけ (フラグメントの最初の起動時に) 呼び出すと、それ自体がローダーのコールバックとして設定されないため、onLoadFinished への呼び出しをまったく受け取りません。onLoadFinished() でいくつかの高価なことが行われる可能性があるため (リストアダプターのクリアなど)、onLoadFinished は 1 回だけ呼び出す必要があるようです。そのため、これがバグなのか、それとも私が間違った時間に init を呼び出すだけです。

誰でもこの問題について洞察を持っていますか?

4

5 に答える 5

3

これはかなり古い質問ですが、将来の読者のために別の解決策があります。基本的に、私がやったことは、ローダーが存在する場合は再起動することでした。

public void onActivityCreated(Bundle savedInstanceState) {
...
       if(getLoaderManager().getLoader(Constants.LOADER_ID) == null) {
            getLoaderManager().initLoader(Constants.LOADER_ID, null, this);
        } else {
            getLoaderManager().restartLoader(Constants.LOADER_ID, null, this);
        }

...
}

これにより、画面の回転時にローダーが2回トリガーされるという問題が解決しました。あまりにも注意すべきことの1つは、これは私がテストしたAndroid <6でのみ必要であるということです. Android 6 では、この問題はまったくないようです。

于 2015-11-29T21:41:28.540 に答える
3

私は同様の問題を抱えていましたが、その原因は私のコードにinitLoaderありました。restartLoaderユーザーのアクションによっては、クエリが変更される可能性があるため、ローダーを再起動する必要がありました。

解決策は、コールバック メソッドrestartLoaderでものみを使用することでした。onResumeinitLoaderrestartLoader

于 2015-05-28T05:55:36.740 に答える