Android Loaders onLoadFinished()立即调用

时间:2017-07-31 03:40:58

标签: android loader asynctaskloader

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

但在我的情况下,我已经AsyncTaskLoader覆盖了loadInBackground()等等。 最后,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()

1 个答案:

答案 0 :(得分:2)

致电deliverResult()后,数据被推出&#34;到onLoadFinished()回调方法,这是按照设计的。

如果你打电话给deliverResult(null),你基本上说你的结果是空的,从LoaderManager的角度来看 - 你的装载机完成了他的工作,他&#34;不关心&#34 ;关于空值。

TL; DR - 是的,您需要自己处理空结果并致电restartLoader()以使您的Loader再次运行。