有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

线程顺序执行中的java RxJava新手问题

大家晚上好,我对RxJava和函数编程都是新手。因此,我用一种方法改进回购协议:

 @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方法中,我将相机保存在本地字段中,在onStart中调用onComplete方法

但当我打电话时:

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

它给了我:

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

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


共 (2) 个答案

  1. # 1 楼答案

    问题是protected void onStart()Activity的生命周期方法,在Activity可见后调用。但是此时你的onComplete还没有被调用,所以cameraList仍然是null。因此,可以使用一些非生命周期方法(如果需要,可以创建一个)或直接在^{中打印内容

    正如@Ben p所指出的,直接调用生命周期方法是个坏主意。在这种情况下,您会干预正常的生命周期调用序列,这可能会导致意外行为

  2. # 2 楼答案

    显然,你有NPE,因为你忘记了从改装中获取摄像头是异步的。这意味着它不会在你叫它的时候完成,而是在一段时间后完成

    你有什么

    1. 你打电话给onCreate
    2. 异步操作已启动,您已请求列表
    3. 你在onStart中使用该列表,但列表还不存在
    4. 异步操作结束,列表现在可用

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

    不要手动调用onStart(),毕竟它的系统回调会在用户看到屏幕时自动运行。它发生的时间比你手动调用的时间要早得多