RxJava2+Retrofit网络轮询(绑定生命周期)

た 入场券 2022-04-16 02:20 598阅读 0赞

有这样一个需求,需要间隔时间轮询服务器接口,但是当不在当前界面时,就要停止轮询,当回到这个界面时,再次开始轮询。
得益于RxJava2强大的操作符,和它本身提供的生命周期控制,可以帮助我们较优雅的实现这个功能。

  1. // 创建Retrofit
  2. Retrofit mRetrofit = new Retrofit.Builder()
  3. .client(builder.build())
  4. .addConverterFactory(ResponseConverterFactory.create())
  5. .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
  6. .baseUrl(baseUrl)
  7. .build();
  8. // 创建ApiService 实例,用于Retrofit 网络请求
  9. ApiService apiService = mRetrofit.create(ApiService.class);
  10. // 网络请求
  11. apiService.warnTotal()
  12. .repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
  13. @Override
  14. public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
  15. // 将原始 Observable 停止发送事件的标识(Complete() / Error())转换成1个 Object 类型数据传递给1个新被观察者(Observable)
  16. // 以此决定是否重新订阅 & 发送原来的 Observable,即轮询 // 此处有2种情况:
  17. // 1. 若返回1个Complete() / Error()事件,则不重新订阅 & 发送原来的 Observable,即轮询结束
  18. // 2. 若返回其余事件,则重新订阅 & 发送原来的 Observable,即继续轮询
  19. return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
  20. @Override
  21. public ObservableSource<?> apply(Object o) throws Exception {
  22. // 延时一分钟轮询
  23. return Observable.timer(1, TimeUnit.MINUTES);
  24. }
  25. });
  26. }
  27. })
  28. .compose(((RxFragmentActivity)context).<BeanWarnTotal>bindUntilEvent(ActivityEvent.PAUSE)) // 绑定生命周期,当PAUSE的时候接触绑定,停止请求。RxJava提供的生命周期管理,是不是很方便,不过需要我们的activity继承自RxFragmentActivity
  29. .subscribeOn(Schedulers.io())
  30. .observeOn(AndroidSchedulers.mainThread())
  31. .subscribe(new Consumer<BeanWarnTotal>() {
  32. @Override
  33. public void accept(BeanWarnTotal beanWarnTotal) throws Exception {
  34. // TODO: 2018/11/15 拿到我们想要的bean
  35. }
  36. });

贴出另外两个类:

  1. public class BeanWarnTotal extends BeanBase {
  2. public int total;
  3. }
  4. public interface ApiService {
  5. @POST("org/warn/total")
  6. Observable<BeanWarnTotal> warnTotal();
  7. }

只要在activity的onResume方法中调用上述方法即可,这样,当每次进入到页面的时候,都会重新进行轮询。
我们可以把上面的方法进行封装,使用起来简洁又方便:

  1. Api.getInstance().warnTotal()
  2. .repeatWhen(new RepeatFunction()) // 轮询
  3. .compose(RetrofitUtils.<BeanWarnTotal>bindLifeCircle(context, ActivityEvent.PAUSE)) // 绑定生命周期
  4. .subscribe(new ApiObserver<BeanWarnTotal>(context, callBack)); // 重写Observer
  5. public class RepeatFunction implements Function<Observable<Object>, ObservableSource<?>> {
  6. @Override
  7. public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
  8. return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
  9. @Override
  10. public ObservableSource<?> apply(Object o) throws Exception {
  11. return Observable.timer(1, TimeUnit.MINUTES);
  12. }
  13. });
  14. }
  15. }
  16. public class RetrofitUtils {
  17. public static <T> ObservableTransformer<T, T> bindLifeCircle(final Context context,
  18. final ActivityEvent activityEvent) {
  19. final ObservableTransformer<T, T> observableTransformer = new ObservableTransformer<T, T>() {
  20. @Override
  21. public ObservableSource<T> apply(Observable<T> upstream) {
  22. if (context instanceof RxFragmentActivity) {
  23. RxFragmentActivity fragmentActivity = (RxFragmentActivity) context;
  24. return (ObservableSource<T>) upstream.subscribeOn(Schedulers.io())
  25. .observeOn(AndroidSchedulers.mainThread())
  26. .compose(fragmentActivity.bindUntilEvent(activityEvent));
  27. }
  28. return upstream.subscribeOn(Schedulers.io())
  29. .observeOn(AndroidSchedulers.mainThread());
  30. }
  31. };
  32. return observableTransformer;
  33. }
  34. }
  35. public class ApiObserver<T> implements Observer<T> {
  36. Context context;
  37. ApiCallBack callBack;
  38. public ApiObserver(Context context, ApiCallBack callBack) {
  39. this.context = context;
  40. this.callBack = callBack;
  41. }
  42. @Override
  43. public void onSubscribe(Disposable d) {
  44. }
  45. @Override
  46. public void onNext(T value) {
  47. // todo
  48. }
  49. @Override
  50. public void onError(Throwable t) {
  51. // todo
  52. }
  53. @Override
  54. public void onComplete() {
  55. }
  56. }

参考:
Android:RxJava 结合 Retrofit 优雅实现 网络请求轮询

发表评论

表情:
评论列表 (有 0 条评论,598人围观)

还没有评论,来说两句吧...

相关阅读