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

Ami*_*jad 15 android ui-thread android-service rx-java rx-android

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

实际上我认为常用的方法是使用BroadcastRecieverCallBack来自Activity.但我听说过使用RxJava(ReactiveX编程)和中介类(以及Dagger将其注入服务和活动),如下所述.

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

资源: 从Service更新UI的有效方式比意图更新?[见第一个答案更新]

Ujj*_*jju 8

需要RxJava/RxAndroid

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

你需要把你的计划1,2,3,

OBSERVABLES去了创建数据的地方,所以在你的情况下服务

观察者去了需要消费(或显示)数据的地方,这就是你的 ACTIVITY

订阅去任何地方,你有机会可观察和观测,所以让我们使用 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

其次,在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);
        }
    };
Run Code Online (Sandbox Code Playgroud)

最后在Activity中链接OBSERVER和OBSERVABLE,否则Observable将不响应,在onCreate中再次使用它

observable.subscribe(observer);
Run Code Online (Sandbox Code Playgroud)

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


npa*_*ace 4

Binder当某些东西绑定到您时您使用的子类可以Service公开一个返回Observable发出进度数据的方法。

Activity这种方法需要注意的是,当实例不再有效时,您需要释放两个资源:服务连接和可观察订阅。

  • 不好的答案。Observable 不是序列化对象,因此不确定它是否可以工作,特别是如果服务是为跨进程交互而设计的。不会工作。 (3认同)