晚上好,我是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
请您解释一下问题。非常感谢您的帮助。
答案 0 :(得分:1)
问题是您的protected void onStart()
是Activity
的生命周期方法,在Activity
可见后才调用。但是到那时,您的onComplete
还没有被调用,因此cameraList
仍然是null
。因此,以某种非生命周期方法(如果需要,可以创建方法)打印内容,或者直接在onComplete
中打印内容。
正如@Ben P指出的那样,直接调用生命周期方法是一个坏主意。在这种情况下,您将按正常的生命周期调用顺序进行干预,这可能会导致意外行为。
答案 1 :(得分:0)
显然您拥有NPE
,因为您忘记了从改造中获取相机是异步操作。这意味着它不会在您调用时完成,而是会在一段时间后完成。
所以你有什么
onCreate
onStart
中使用了该列表,但列表尚不存在 换句话说,在调用RxJava的subscribe
方法之前,您不能使用它。
请勿手动调用onStart()
,它的系统毕竟会回调并在用户可见屏幕时自动运行。它发生的时间比您手动调用的时间早得多。