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 Honeycomb 中的加载器

于 2012-04-25T19:15:46.603 回答
4

关于 Loaders 的三个要点是:

  1. forceLoad()初始化加载器时始终使用方法。例如:

    getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
    
  2. 始终执行onStartLoading(). LoaderManager当相关的片段/活动启动时,将自动调用此函数。

  3. 确保加载器的 ID 是唯一的,否则将不会调用新的加载器。

如果仍然有问题,您可以通过调用该isStarted()方法检查 loader 的状态。

于 2015-03-07T09:54:18.700 回答
2

您需要保留对您在方法中创建的加载程序实例的引用onCreateLoader。然后,要刷新它,请调用yourLoader.onContentChanged();

于 2012-05-01T21:08:34.360 回答
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 :)

于 2014-10-17T15:23:36.733 回答