【问题标题】:Android Loaders onLoadFinished() called immediatelyAndroid Loaders onLoadFinished() 立即调用
【发布时间】:2017-07-31 03:40:58
【问题描述】:

我正在使用加载器实现网络通信......因为他们中的大多数人都推荐它并且“他们了解生命周期”。

但在我的情况下,我扩展了 AsyncTaskLoader 覆盖了 loadInBackground() etc.etc。 最后onLoadFinished()被正常调用。

但是我的问题是在网络错误的情况下发生的。如果数据为空 立即调用onLoadFinished(),无需网络调用。

根据谷歌文档:

在任何一种情况下,给定的回调都与加载器相关联,并且 将在加载程序状态更改时调用。如果在呼叫点 调用者处于启动状态,并且请求的加载器已经 存在并已生成其数据,然后回调 onLoadFinished(Loader, D) 将立即被调用(在这个内部 函数),所以你必须为此做好准备。

这是我必须处理的事情吗,使用标志进行跟踪,下次在我的活动中调用restartLoader() 而不是initLoader()。或者我做错了什么。

我在下面发布了我的代码的重要部分:

在主要活动中:

   protected void postJson(int loaderId, Parcelable object, boolean loadOffline) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(Constants.OBJ, object);
        bundle.putBoolean(Constants.OFFLINE, loadOffline);
        loaderManager.initLoader(loaderId, bundle, this);
    }

NetworkAsyncTaskLoader

@Override
public Result loadInBackground() {
                Constants.verbose("loadInBackground Called");
                .....
                Response tempResult;
                try {
                    tempResult = loadFromNetwork();

                   ........
                } catch (IOException e) {
                    Constants.error("Network Error for loader Id: " + loaderId, e);
                    return null;
                }
        }



@Override
public void deliverResult(Result result) {
            Constants.verbose("deliverResult called");
            super.deliverResult(result);
        }

onLoadFinished() 在活动中

    @Override
  public void onLoadFinished(Loader loader, NetworkAsyncTaskLoader.Result data) {
        hideProgress();
        Constants.debug("Load finished for: " + loader.getId());
        .....
    }

下面是堆栈跟踪..

07-31 10:08:02.177 27677-28061/com.sample.test D/OkHttp: <-- HTTP FAILED: java.net.ConnectException: Failed to connect to ...
07-31 10:08:02.179 27677-28061/com.sample.test E/Test: Network Error for loader Id: 101
                                                                  java.net.ConnectException: Failed to connect to ...
07-31 10:08:02.192 27677-27677/com.sample.test V/Test: deliverResult called
07-31 10:08:02.193 27677-27677/com.sample.test D/Test: Load finished for: 101
07-31 10:08:08.982 27677-27677/com.sample.test D/Test: Load finished for: 101

你可以看到下次我打电话给initLoader()或者尝试发起网络调用..它直接调用onLoadFinished()

更新:

我最终创建了一个标志,如果出现网络错误或出现问题,该标志设置为 false,然后如果标志为 true,则改为调用 restartLoader()。

【问题讨论】:

    标签: android loader asynctaskloader


    【解决方案1】:

    一旦你调用deliverResult(),数据就会被“推送”到onLoadFinished()回调方法,这是设计好的。

    如果你打电话给deliverResult(null),你基本上是在说你的结果是空的,从 LoaderManager 的角度来看 - 你的 Loader 完成了他的工作,他“不关心”空值。

    TL;DR - 是的,您需要自己处理 null 结果并调用restartLoader() 以使您的加载器再次运行。

    【讨论】:

    • 没问题。别忘了点赞,采纳答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多