猿问

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

大家晚上好,我是 RxJava 和函数式编程的新手。所以我有一个使用方法的 Retrofit repo:


 @POST("/rest/getMonitors")

Observable<List<Camera>> getMonitors(@Body User user);

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


在我的主要活动中:


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

你能解释一下这个问题吗,请。非常感谢您的帮助。


缥缈止盈
浏览 162回答 2
2回答

千万里不及你

问题是您protected void onStart()的生命周期方法Activity是在Activity可见后调用的。但那时你onComplete还没有被调用,所以cameraList仍然是null.&nbsp;因此,以某种非生命周期方法(如果需要创建一个)或直接在onComplete.正如@Ben P 指出的那样,直接调用生命周期方法是个坏主意。在这种情况下,您会干预可能导致意外行为的正常生命周期调用序列。

烙印99

显然你有,NPE因为你忘记了从改造中获取相机是异步操作。这意味着它不会在您调用它时完成,而是在一段时间后完成。所以你有什么你打过电话了&nbsp;onCreate异步操作开始,您请求列表您在 中使用该列表onStart,但该列表尚不&nbsp;存在异步操作结束,列表现在可用。换句话说,在调用 RxJava 的subscribe方法之前,您不能使用它。不要onStart()手动调用,毕竟它的系统回调会在用户看到屏幕时自动运行。它发生的时间比您手动调用要早得多。
随时随地看视频慕课网APP

相关分类

Java
我要回答