web-dev-qa-db-ja.com

RxJava / RxAndroidを使用してAndroidサービスからUIを更新する方法

私はファイルのダウンロードを担当するバウンドサービスを持っているので、ダウンロードのステータス/進行状況を認識しています。また、UI(フラグメントまたはアクティビティ)は、サービスからのダウンロードの進行状況を表示/更新する必要があります。

実際、一般的な方法は、ActivityのBroadcastRecieverまたはCallBackを使用することだと思います。しかし、RxJava(ReactiveXプログラミング)とmediatorクラス(およびサービスとアクティビティの両方に注入するためのDagger)の使用についてどこかで聞いたことがあります。

だから私の質問は、これらの束でRxJavaを処理する方法ですか?コードサンプルはありますか?インテントを使用する以外に効率的な方法はありますか?

リソース: インテントよりもサービスからUIを更新するより効率的な方法? [最初の回答の更新を参照]

RxJava/RxAndroidに必要

1)オブザーバブル2)オブザーバブル3)サブスクライブ

12、、を配置する必要がある場所を計画します

[〜#〜] 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()を使用してサービスからデータがトリガーされると、データはアクティビティに到着します

10
Ujju

何かがBinderにバインドするときに使用するServiceサブクラスは、進行状況データを出力するObservableを返すメソッドを公開できます。

このアプローチの注意点は、Activityインスタンスが無効になったときに解放する必要がある、サービス接続と監視可能なサブスクリプションの2つのリソースがあることです。

3
npace