16

I have a fragment, and want to start a loader when a button is clicked:

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.";
    }
}

After clicking the button, I can see my callback's onCreateLoader method called, but the created loader never actually starts. Do we need to call forceLoad() on the loader itself to get it to actually start? None of the sample posts do this,

Thanks

Alex Lockwood
  • 83,063
  • 39
  • 206
  • 250
user291701
  • 38,411
  • 72
  • 187
  • 285

5 Answers5

32

You need to implement onStartLoading() and call forceLoad() somewhere in the method.

See this post for more information: Implementing Loaders (part 3)

Alex Lockwood
  • 83,063
  • 39
  • 206
  • 250
6

In my experience it never worked unless I used forceLoad().

You may find the answer to this previous question helpful: Loaders in Android Honeycomb

Community
  • 1
  • 1
nohawk
  • 61
  • 1
4

Three important points regarding Loaders are:

  1. Always Use forceLoad() method while initialising Loaders. For Example:

    getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
    
  2. Always implement onStartLoading(). This function will automatically be called by LoaderManager when the associated fragment/activity is being started.

  3. Make sure the ID of the loader is unique otherwise new Loader will not be called.

If there is still a problem you can check the state of loader by calling the isStarted() method.

Christopher Creutzig
  • 8,656
  • 35
  • 45
Tarun Deep Attri
  • 8,174
  • 8
  • 41
  • 56
2

You need to keep a reference to the instance of the loader you create in the method onCreateLoader. Then, to refresh it, call yourLoader.onContentChanged();

Snicolas
  • 37,840
  • 15
  • 114
  • 173
2

If you have more than 1 loader in the same activity, make sure their id differs. I lost few hours to figure it out :)

Golan Shay
  • 1,250
  • 18
  • 15