16

フラグメントがあり、ボタンがクリックされたときにローダーを開始したい:

public class MyFragment extends Fragment {

    public void onActivityCreated() {
        super.onActivityCreated();

        Button btn = ...;
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                getLoaderManager().initLoader(500, null, mMyCallback);
            }
        });
    }  

    private LoaderManager.LoaderCallbacks<String> mMyCallback = new  LoaderManager.LoaderCallbacks<String>() {

        @Override
        public Loader<String> onCreateLoader(int arg0, Bundle arg1) {
            Log.e(TAG, "LoaderCallback.onCreateLoader().");
            return new MyLoader(getActivity());
        }
    }
}

public class MyLoader extends AsyncTaskLoader<String> {
    public MyLoader(Context context) {
        super(context);
    }

    @Override
    public String loadInBackground() {
        Log.e(TAG, "Hi, running.");
        return "terrific.";
    }
}

ボタンをクリックすると、コールバックの onCreateLoader メソッドが呼び出されているのがわかりますが、作成されたローダーは実際には起動しません。実際に起動するには、ローダー自体で forceLoad() を呼び出す必要がありますか? これを行うサンプル投稿はありません。

ありがとう

4

5 に答える 5

32

メソッドのどこかに実装onStartLoading()して呼び出す必要があります。forceLoad()

詳細については、この投稿を参照してください:ローダーの実装(パート3)

于 2012-08-23T16:29:04.093 に答える
6

私の経験では、使用しない限り機能しませんでしたforceLoad()

この前の質問への回答が役立つ場合があります: Android ハニカムのローダー

于 2012-04-25T19:15:46.603 に答える
4

ローダーに関する 3 つの重要なポイントは次のとおりです。

  1. forceLoad()ローダーの初期化中は常にメソッドを使用します。例えば:

    getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
    
  2. 必ず実装してonStartLoading()ください。LoaderManagerこの関数は、関連付けられたフラグメント/アクティビティが開始されるときにによって自動的に呼び出されます。

  3. ローダーの ID が一意であることを確認してください。そうしないと、新しいローダーが呼び出されません。

それでも問題がある場合は、isStarted()メソッドを呼び出してローダーの状態を確認できます。

于 2015-03-07T09:54:18.700 に答える
2

同じアクティビティに複数のローダーがある場合は、ID が異なることを確認してください。私はそれを理解するために数時間を失いました:)

于 2014-10-17T15:23:36.733 に答える
2

メソッドで作成したローダーのインスタンスへの参照を保持する必要がありますonCreateLoader。次に、それを更新するには、呼び出しますyourLoader.onContentChanged();

于 2012-05-01T21:08:34.360 に答える