线程顺序执行中的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
请你解释一下这个问题好吗。非常感谢你的帮助
# 1 楼答案
问题是中打印内容
protected void onStart()
是Activity
的生命周期方法,在Activity
可见后调用。但是此时你的onComplete
还没有被调用,所以cameraList
仍然是null
。因此,可以使用一些非生命周期方法(如果需要,可以创建一个)或直接在^{正如@Ben p所指出的,直接调用生命周期方法是个坏主意。在这种情况下,您会干预正常的生命周期调用序列,这可能会导致意外行为
# 2 楼答案
显然,你有
NPE
,因为你忘记了从改装中获取摄像头是异步的。这意味着它不会在你叫它的时候完成,而是在一段时间后完成你有什么
onCreate
onStart
中使用该列表,但列表还不存在换句话说,在调用RxJava的
subscribe
方法之前,您不能使用它不要手动调用
onStart()
,毕竟它的系统回调会在用户看到屏幕时自动运行。它发生的时间比你手动调用的时间要早得多