前面三章主要讲解了RxJava的部分内容,而作为Android开发者就不得不提到将RxJava和Android结合起来应用的框架---RxAndroid。
RxAndroid是RxJava的扩展,包含了一些针对Android的特殊绑定。
1 AndroidSchedulers 它为Android线程机制提供了现成的schedulers。如果希望在UI线程上执行一些代码只管用AndroidSchedulers.mainThread()。
retrofitService.getImage(url) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));
AndroidObservable.bindActivity(this, retrofitService.getImage(url)) .subscribeOn(Schedulers.io()) .subscribe(bitmap -> myImageView.setImageBitmap(bitmap);
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); AndroidObservable.fromBroadcast(context, filter) .subscribe(intent -> handleConnectivityChange(intent));
ViewObservable.clicks(mCardNameEditText, false) .subscribe(view -> handleClick(view));
回调使用:
@GET("/user/{id}/photo") void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
@GET("/user/{id}/photo") Observable<Photo> getUserPhoto(@Path("id") int id);
Observable.zip( service.getUserPhoto(id), service.getPhotoMetadata(id), (photo, metadata) -> createPhotoWithData(photo, metadata)) .subscribe(photoWithData -> showPhoto(photoWithData));
我把难点留到了最后,即如何处理activity的生命周期。有两个老生常谈的问题:
1 在configuration改变的时候持续Subscription(比如屏幕翻转)。
2 因Observable内持有context引用引发的内存泄漏问题。
尽管没有标准答案,但有些思路可以参考。
第一个问题,缓存一份请求,在activity重建后再次被订阅,而在此之前需要先解绑上一次被订阅的观察者:
Observable<Photo> request = service.getUserPhoto(id).cache(); Subscription sub = request.subscribe(photo -> handleUserPhoto(photo)); // ...When the Activity is being recreated... sub.unsubscribe(); // ...Once the Activity is recreated... request.subscribe(photo -> handleUserPhoto(photo));第二个问题,重点在于管理subscription,即合适的解绑订阅,那么通常的做法就是CompositeSubscription,添加进所有的subscription然后在适当的时候一次性解绑:
private CompositeSubscription mCompositeSubscription = new CompositeSubscription(); private void doSomething() { mCompositeSubscription.add( AndroidObservable.bindActivity(this, Observable.just("Hello, World!")) .subscribe(s -> System.out.println(s))); } @Override protected void onDestroy() { super.onDestroy(); mCompositeSubscription.unsubscribe(); }
基础教学到此结束,重点在于数据链和操作符的理解。