为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2021-06-27 17:20:39
大家晚上好,我是 RxJava 和函数式编程的新手。所以我有一个使用方法的 Retrofit repo: @POST("/rest/getMonitors")Observable<List<Camera>> getMonitors(@Body User user);这是正常工作。它返回我的相机实体列表。在我的主要活动中:List<Camera> cameraList;@Overrideprotected 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。但是当我打电话时:@Overrideprotected void onStart() {    super.onStart();    Log.i("@@@SIZE", String.valueOf(cameraList.size()));}它给了我:'int java.util.List.size()' on a null object reference你能解释一下这个问题吗,请。非常感谢您的帮助。
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

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

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


查看完整回答
反对 回复 2021-07-07
?
烙印99

TA贡献1829条经验 获得超13个赞

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

所以你有什么

  1. 你打过电话了 onCreate

  2. 异步操作开始,您请求列表

  3. 您在 中使用该列表onStart,但该列表尚不 存在

  4. 异步操作结束,列表现在可用。

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

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


查看完整回答
反对 回复 2021-07-07
  • 2 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信