私はファイルのダウンロードを担当するバウンドサービスを持っているので、ダウンロードのステータス/進行状況を認識しています。また、UI(フラグメントまたはアクティビティ)は、サービスからのダウンロードの進行状況を表示/更新する必要があります。
実際、一般的な方法は、ActivityのBroadcastReciever
またはCallBack
を使用することだと思います。しかし、RxJava(ReactiveXプログラミング)とmediatorクラス(およびサービスとアクティビティの両方に注入するためのDagger)の使用についてどこかで聞いたことがあります。
だから私の質問は、これらの束でRxJavaを処理する方法ですか?コードサンプルはありますか?インテントを使用する以外に効率的な方法はありますか?
リソース: インテントよりもサービスからUIを更新するより効率的な方法? [最初の回答の更新を参照]
RxJava/RxAndroidに必要
1)オブザーバブル2)オブザーバブル3)サブスクライブ
1、2、、を配置する必要がある場所を計画します
[〜#〜] observables [〜#〜]データが作成された場所に移動するので、あなたの場合は[〜#〜]サービス[〜#〜]
[〜#〜] observers [〜#〜]データを消費(または表示)する必要がある場所に移動するので、それはあなたです[〜#〜]アクティビティ[〜#〜]
[〜#〜] 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;
}
}
次に、アクティビティの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);
}
};
最後に、アクティビティでOBSERVERとOBSERVABLEの両方をリンクします。そうしないと、Observableが応答しません。これをonCreateで再度使用してください。
observable.subscribe(observer);
完了、onNext()を使用してサービスからデータがトリガーされると、データはアクティビティに到着します
何かがBinder
にバインドするときに使用するService
サブクラスは、進行状況データを出力するObservable
を返すメソッドを公開できます。
このアプローチの注意点は、Activity
インスタンスが無効になったときに解放する必要がある、サービス接続と監視可能なサブスクリプションの2つのリソースがあることです。