【问题标题】:Loader doesn't start after calling initLoader()?调用 initLoader() 后 Loader 不启动?
【发布时间】:2012-05-06 11:52:19
【问题描述】:

我有一个片段,并希望在单击按钮时启动加载器:

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() 才能让它真正启动?没有一个示例帖子这样做,

谢谢

【问题讨论】:

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


    【解决方案1】:

    你需要实现onStartLoading()并在方法的某处调用forceLoad()

    更多信息请看这篇文章:Implementing Loaders (part 3)

    【讨论】:

    • 我应该在 forceLoad() 方法中实际实现什么?
    • @Manikanta 我的回答是你应该致电 forceLoad(),而不是实施它。
    • 其实我想从 SQLiteOpenHelper 不断更新我的 ListView,我不知道哪种方式更可取。你能建议任何方法吗?
    【解决方案2】:

    根据我的经验,除非我使用forceLoad(),否则它永远不会起作用。

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

    【讨论】:

      【解决方案3】:

      关于 Loaders 的三个要点是:

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

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

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

      如果还是有问题可以调用isStarted()方法检查loader的状态。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 天啊,你真的解决了我的整个问题。
        【解决方案5】:

        如果您在同一个活动中有超过 1 个加载程序,请确保它们的 id 不同。我花了几个小时才弄清楚:)

        【讨论】:

          猜你喜欢
          • 2011-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-12
          • 2012-09-16
          相关资源
          最近更新 更多