【问题标题】:LoaderCallbacks missed after rotationLoaderCallbacks 旋转后丢失
【发布时间】:2013-03-04 15:35:39
【问题描述】:

我每次使用加载器时都会遇到这个问题。如果我启动我的AsyncTaskLoader 然后旋转屏幕(一次或几次都没有关系)onLoaderFinished() 不会被调用。 loadInBackground() 完成了它的工作,但 onLoaderFinished() 没有被调用。似乎错过了回调,但在活动 onCreate() 我有:

LoaderManager lm = getSupportLoaderManager();
if (lm.getLoader(LOADER_FLIGHTS) != null) {
    lm.initLoader(LOADER_FLIGHTS, null, mFlightsLoaderCallbacks);
}

通过活动或字段实现回调无关紧要。就我而言,我使用字段:

LoaderCallbacks<SearchResult> mFlightsLoaderCallbacks = new LoaderCallbacks<SearchResult>() {

有时它工作得很好,但在某些设备上我又遇到了这个问题。

我在 Android 错误跟踪器中进行了搜索,但没有发现任何有用的信息。

这是我的错误吗?我该如何纠正?

编辑:

private Handler mHandler = new Handler();

@Override
public void onLoadFinished(Loader<SearchResult> loader, SearchResult res) {
    mHandler.post(new Runnable() {

        @Override
        public void run() {
            dismissProgress(R.string.dlg_wait_flights);
        }
    });
    mResult = res;
    Helper.Log.d(TAG, "Loader.onLoadFinished.");

【问题讨论】:

  • 你的Activity处理程序,还是有处理程序对象?你确定它没有被执行,还是你只是看不到结果?
  • @ClassStacker 请查看更新后的代码
  • 关于您的编辑,这意味着您没有看到日志消息?

标签: android android-loadermanager android-support-library android-loader android-configchanges


【解决方案1】:

不要将 initLoader 调用包装在 if 语句中。事实上,如果您在调用 initLoader 之前就期望加载器不为空,我什至不确定如何调用 initLoader。

【讨论】:

  • 如果我这样做,我的加载器将立即启动。如果我不想要这个怎么办?
  • 好的,所以您是说您在问题中未包含的其他地方调用 initLoader。您是否使用 setRetainInstance(true) 保留您的片段?
  • 您的清单中是否注册了任何方向更改?
  • 您确定您的 initLoader 调用是在轮换之后进行的吗?
  • 您是否考虑过调用 LoaderManager.restartLoader 方法?这允许您指示您的加载器再次加载其数据,并且(取决于您的加载器的实现)完成此操作后,您的 onLoadFinished 将被调用。
猜你喜欢
  • 2014-01-29
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2012-04-03
  • 2011-07-04
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多