调用initLoader()后,Loader无法启动?

时间:2012-04-25 18:34:32

标签: java android android-activity android-fragments android-loadermanager

我有一个片段,想要在点击一个按钮时启动一个加载器:

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()来实际启动它?没有样本帖子这样做,

由于

5 个答案:

答案 0 :(得分:32)

您需要实施onStartLoading()并在方法中的某处调用forceLoad()

有关详情,请参阅此帖子:Implementing Loaders (part 3)

答案 1 :(得分:6)

根据我的经验,除非我使用forceLoad(),否则它从未奏效。

您可能会发现上一个问题的答案有用: Loaders in Android Honeycomb

答案 2 :(得分:4)

关于装载机的三个要点是:

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

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

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

  4. 如果仍有问题,可以通过调用isStarted()方法检查加载器的状态。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

如果同一活动中有多个加载程序,请确保其ID不同。我失去了几个小时才弄明白:)