我有一个绑定服务,负责下载文件,因此它知道下载状态/进度。 UI(片段或活动)必须显示/更新服务的下载进度。
实际上我认为通常的方法是使用活动中的BroadcastReciever
或CallBack
。但我听说过使用RxJava(ReactiveX Programming)和 mediator 类(以及Dagger将其注入服务和活动),如下所述。
所以我的问题是如何使用这些东西来处理RxJava?任何代码示例?有没有比使用意图更有效的方法?
资源: More efficient way of updating UI from Service than intents? [见第一个答案更新]
答案 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
实例不再有效时,您需要释放两个资源:服务连接和可观察订阅。