线程顺序执行中的RxJava newbee问题

时间:2018-08-08 20:08:28

标签: java android rx-java2

晚上好,我是RxJava和函数式编程的新手。因此,我可以使用以下方法进行改造回购:

 @POST("/rest/getMonitors")
Observable<List<Camera>> getMonitors(@Body User user);

这是正常工作。它会返回我“相机”实体的列表。

在我的MainActivity中:

List<Camera> cameraList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    serverApi.getMonitors(user)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    cameras -> cameraList = cameras,
                    throwable -> {},
                    ()->onStart()
                    );
 }

所以在OnCreate中,我试图获取摄像机列表。在onNext方法中,我将摄像机保存在本地字段中,在onComplete方法中,我要求使用onStart。

但是当我打电话时:

@Override
protected void onStart() {
    super.onStart();
    Log.i("@@@SIZE", String.valueOf(cameraList.size()));}

它给了我

'int java.util.List.size()' on a null object reference

请您解释一下问题。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题是您的protected void onStart()Activity的生命周期方法,在Activity可见后才调用。但是到那时,您的onComplete还没有被调用,因此cameraList仍然是null。因此,以某种非生命周期方法(如果需要,可以创建方法)打印内容,或者直接在onComplete中打印内容。

正如@Ben P指出的那样,直接调用生命周期方法是一个坏主意。在这种情况下,您将按正常的生命周期调用顺序进行干预,这可能会导致意外行为。

答案 1 :(得分:0)

显然您拥有NPE,因为您忘记了从改造中获取相机是异步操作。这意味着它不会在您调用时完成,而是会在一段时间后完成。

所以你有什么

  1. 您打了onCreate
  2. 开始异步操作,您已请求列表
  3. 您在onStart中使用了该列表,但列表尚不存在
  4. 异步操作结束,列表现在可用。

换句话说,在调用RxJava的subscribe方法之前,您不能使用它。

请勿手动调用onStart(),它的系统毕竟会回调并在用户可见屏幕时自动运行。它发生的时间比您手动调用的时间早得多。

相关问题