如何使用RxJava / RxAndroid从Android服务更新UI

时间:2015-11-20 21:11:09

标签: android android-service rx-java ui-thread rx-android

我有一个绑定服务,负责下载文件,因此它知道下载状态/进度。 UI(片段或活动)必须显示/更新服务的下载进度。

实际上我认为通常的方法是使用活动中的BroadcastRecieverCallBack。但我听说过使用RxJava(ReactiveX Programming)和 mediator 类(以及Dagger将其注入服务和活动),如下所述。

所以我的问题是如何使用这些东西来处理RxJava?任何代码示例?有没有比使用意图更有效的方法?

资源: More efficient way of updating UI from Service than intents? [见第一个答案更新]

2 个答案:

答案 0 :(得分:7)

需要RxJava / RxAndroid

1)OBSERVABLES 2)观察员 3)订阅

计划您需要放置 1 2 3

的位置

OBSERVABLES 转到创建数据的位置,因此在您的情况下 SERVICE

OBSERVERS 转到需要使用(或显示)数据的位置,这样就是 ACTIVITY

SUBSCRIBE 可以访问您可以访问OBSERVABLE& OBSERVER,让我们使用 ACVITITY

程序和代码:

首先, 像这样准备你的OBSERVABLE

class MyService extends Service {
    static PublishSubject<String> data = PublishSubject.create();

   @Override
   public void onStarCommand(Intent intent,int i, int j){
        # DO THIS ANYWHER WHERE YOU GENERATE DATA 
        data.onNext("Hello");
   }

   public static Observable<String> getObservable(){
      return data;
   }
}

其次, 在Activity的onCreate

中准备你的OBSERVER(和OBSERVABLE)
Observable<String> observable = MyService.getObservable();
Observer<String> observer = new Observer<String>() {
        @Override
        public void onCompleted() {
            Log.d(TAG, "onCompleted: ");
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "onError: ",e);
        }

        @Override
        public void onNext(String text) {
            Log.d(TAG, "DATA reveived here: "+text);
        }
    };

最后 在Activity中链接OBSERVER和OBSERVABLE,否则Observable将不响应, 在onCreate

中再次使用它
observable.subscribe(observer);

DONE,现在即使使用onNext()从Service触发数据,数据也会到达Activity

答案 1 :(得分:3)

当您绑定到Binder的某些内容时,您使用的Service子类可以公开返回Observable的方法,该方法会发出进度数据。

使用此方法的警告是,当Activity实例不再有效时,您需要释放两个资源:服务连接和可观察订阅。