大家晚上好,我是 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 回答
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
千万里不及你
TA贡献1784条经验 获得超9个赞
问题是您protected void onStart()
的生命周期方法Activity
是在Activity
可见后调用的。但那时你onComplete
还没有被调用,所以cameraList
仍然是null
. 因此,以某种非生命周期方法(如果需要创建一个)或直接在onComplete
.
正如@Ben P 指出的那样,直接调用生命周期方法是个坏主意。在这种情况下,您会干预可能导致意外行为的正常生命周期调用序列。
![?](http://img1.sycdn.imooc.com/5333a0780001a6e702200220-100-100.jpg)
烙印99
TA贡献1829条经验 获得超13个赞
显然你有,NPE
因为你忘记了从改造中获取相机是异步操作。这意味着它不会在您调用它时完成,而是在一段时间后完成。
所以你有什么
你打过电话了
onCreate
异步操作开始,您请求列表
您在 中使用该列表
onStart
,但该列表尚不 存在异步操作结束,列表现在可用。
换句话说,在调用 RxJava 的subscribe
方法之前,您不能使用它。
不要onStart()
手动调用,毕竟它的系统回调会在用户看到屏幕时自动运行。它发生的时间比您手动调用要早得多。
添加回答
举报
0/150
提交
取消