RxJava(十):DisposableとTransformerの使用


ブログ
1. Disposable
RxJav 1.xでは、Subscriptionのインタフェースを使用して購読をキャンセルできます.
public interface Subscription {

    /**
     * Stops the receipt of notifications on the {@link Subscriber} that was registered when this Subscription
     * was received.
     * 

* This allows deregistering an {@link Subscriber} before it has finished receiving all events (i.e. before * onCompleted is called). */ void unsubscribe(); /** * Indicates whether this {@code Subscription} is currently unsubscribed. * * @return {@code true} if this {@code Subscription} is currently unsubscribed, {@code false} otherwise */ boolean isUnsubscribed(); }


Rx.Java l.xで、Observable.subscribe()メソッドは、Subscriptionのオブジェクトを返します.つまり、サブスクリプションを購読するたびにSubscriptionに戻ります.Subscriptionはunsubscribeを呼び出すだけで購読をキャンセルできます.
Subscriptionオブジェクトは,被観察者と購読者との間の絆である.RxJavaがSubscription処理を使用して購読をキャンセルすると、呼び出しチェーン全体が停止します.複雑なオペレータの一連が使用されている場合、unsubscribe()の呼び出しは、追加の作業を必要とせずに現在実行されている場所で終了します.
Androidの開発では、Activity/fragmentのonDestroyでリソースを解放することを行い、RxJava l.xを使用すればSubscriptionを使用することができます.isUnsubscribed()Subsccriptionがunsubscribedであるかどうかを確認します.unsubscribedの場合、Subscriptが呼び出される.unsubscribe()では、RxJavaはサブスクリプション井戸の通知をSubscriberにキャンセルし、井戸はゴミ回収メカニズムでオブジェクトを解放し、RxJavaによるメモリ漏洩を防止します.
RxJava 2.0以降、SubscriptionはDisposableと改名された.RxJava 2.xにおいて、自ら存在することからorgという.reactivestreams.Subscriptionというクラス(Reactive Streams規格に準拠)は、名前の競合を避けるため、元のrx.Subscriptionをio.reactivex.disposables.Disposableと改名
public interface Disposable {
    /**
     * Dispose the resource, the operation should be idempotent.
     */
    void dispose();

    /**
     * Returns true if this resource has been disposed.
     * @return true if this resource has been disposed
     */
    boolean isDisposed();
}

Disposable disposable = Observable.just("hello, rxjava")
        .subscribe(new Consumer() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, "Next: " + s);
            }
        });

disposable.dispose();

1.1 CompositeDisposable
RxJava 1.xには複合サブスクリプション(composite subscription)という概念がある.RxJava 2.xでは、RxJavaにも複合サブスクリプションのようなコンテナCompositeDisposableが内蔵されており、1つのDisposableを得るたびにCompositeDisposable.add()を呼び出してコンテナに追加し、終了するとCompositeDisposableを呼び出す.clear()はすべてのイベントを遮断することができます.Androidでは、ActivityやFragment向けのCompositeDisposableがよく見られます.これによりonDestroyや他の適切な場所で購読をキャンセルすることができます.
2.RxLifecycleとAutoDispose
Android開発では、Disposableを使用して1つのサブスクリプションを管理したり、CompositeDisposableを使用して複数のサブスクリプションを管理したりすることができ、タイムリーにキャンセルされなかったため、Activity/fragmentが破棄できずメモリが漏洩することを防止します.しかし、これらのことを行うには、比較的成熟したライブラリもあります.
2.1 RxLifecycle
GitHubダウンロードアドレス:https://github.com/trello/RxL...
RxLifecycleはActivity/fragmentライフサイクルに合わせてサブスクリプションを管理します.RxJava Observableサブスクリプション後(subscribe関数が呼び出される)、バックグラウンドスレッドでは一般的にいくつかの操作が実行されます(例えば、ネットワーク要求データへのアクセス)バックグラウンド操作が戻ってきたら、ObserverのonNextなどの関数を呼び出してUI状態を更新する.しかし、バックグラウンドスレッド要求には時間がかかり、ユーザーがリフレッシュボタンをクリックして新しいマイクロブログ情報を要求し、リフレッシュがまだ完了していない場合、ユーザーが現在のインタフェースを終了して前のインタフェースに戻り、このときリフレッシュするのObservableが購読をキャンセルしないと、以前のActivityがJVMに回収されず、メモリが漏洩します.これがAndroid開発で注目すべき点で、RxLifecycleはこのことを専門にしています.
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'

// If you want to bind to Android-specific lifecycles
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'

// If you want pre-written Activities and Fragments you can subclass as providers
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'

// If you want pre-written support preference Fragments you can subclass as providers
implementation 'com.trello.rxlifecycle2:rxlifecycle-components-preference:2.2.2'

// If you want to use Navi for providers
implementation 'com.trello.rxlifecycle2:rxlifecycle-navi:2.2.2'

// If you want to use Android Lifecycle for providers
implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.2'

// If you want to use Kotlin syntax
implementation 'com.trello.rxlifecycle2:rxlifecycle-kotlin:2.2.2'

// If you want to use Kotlin syntax with Android Lifecycle
implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.2'

このライブラリを使用したいActivityまたはFragmentでは、RxActivity、RxAppCompatActivityまたはRxFragmentを継承し、対応するimport文を追加できます.
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;

public class BackPressureAct extends RxAppCompatActivity { }

ObservableをActivityまたはFragmentライフサイクルにバインドする場合は、Observableが終了すべきライフサイクルイベントを指定するか、RxLifecycleライブラリにObservableシーケンスをいつ終了するかを決定させます.
デフォルトでは、RxLifecycleはセカンダリライフサイクルイベントでObservableを終了します.したがって、ActivityのonCreate()メソッドの間にObservableが購読された場合、RxLifecycleはそのActivityのonDestroy()メソッドでObservableシーケンスを終了します.FragmentのonAttach()メソッドで購読すると、RxLifecycleはonDetach()メソッドでシーケンスを終了します.
2.2 AutoDispose
GitHubダウンロードアドレス:https://github.com/uber/AutoD...
AutoDisposeはUberオープンソースのライブラリです.RxLifecycleとの違いは、AndroidプラットフォームだけでなくJava(のエンタープライズクラス)プラットフォームでも使用でき、適用範囲が広いことです.
現在、CompositeDisposableとRxLifecycleのほかに、AutoDisposeの選択が1つ増えています.AutoDisposeはKotlin、Android Architecture Componentsをサポートし、井戸とAutoDisposeはRxLifecycleと相互運用することができます.
3.TransformerのRxJavaでの使用
3.1 Transformerの用途
Transformerは変換器の意味です.早くもRxJava 1.x版はObservableである.Transformer、Single .TransformerとCompletable.Transformer.RxJava 2.xバージョンにはObservableTransformer、SingleTransformer、CompletableTransformer、FlowableTransformer、MaybeTransformerがあります.このうち、FlowableTransformerとMaybeTransformerが追加されました.RxJava 2.xはObservableをObservableとFlowableに分割したのでFlowableTransformerができました.同様に、MaybeもRxJava 2である.xは新しいタイプなのでMaybeTransformerがあります
Transformerは、1つのObservable/FLowable/single/Completable/Maybeオブジェクトを別のObservable/FLowable/single/Completable/Maybeオブジェクトに変換することができ、一連のインライン操作を呼び出すのと同じである.
簡単な例を挙げると、transformer()メソッドを書いて、送信整数Observableを送信文字列のObservableに変換します.
private static ObservableTransformer transformer() {

    return new ObservableTransformer() {
        @Override
        public ObservableSource apply(Observable upstream) {
            return upstream.map(new Function() {
                @Override
                public String apply(Integer integer) throws Exception {
                    return String.valueOf(integer);
                }
            });
        }
    };
}

transformer()メソッドを使用して、標準RxJavaで操作します.
Observable.just(123, 456)
        .compose(transformer())
        .subscribe(new Consumer() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, "Next: " + s);
            }
        });

//     
 Next: 123
 Next: 456

3.2 composeオペレータとの併用
composeオペレータは、データストリームから元のオブジェクトを得ることができる.オブジェクトを作成すると、composeオペレータはすぐに実行され、他のオペレータがonNext()呼び出し後に実行する必要はありません.
composeオペレータについては、国内でも対応する翻訳があります:https://www.jianshu.com/p/e9e...
よく使うシーン
  • メインスレッドに切り替え
  • ネットワークリクエストの場合、スレッドを切り替えるには、次の操作を行うことがよくあります.
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())

    簡単なパッケージを作成します.
    object RxJavaUtils {
    
        @JvmStatic
        fun  observableToMain(): ObservableTransformer {
            return ObservableTransformer { upstream ->
                upstream
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
            }
        }
    
        @JvmStatic
        fun  flowableToMain(): FlowableTransformer {
            return FlowableTransformer { upstream ->
                upstream
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
            }
        }
    }

    このコードはKotlinで書かれており、いくつかのツールクラスをKotlinで記述しており、KotlinのLambda式もより直感的です.
    Flowableがプライマリスレッドに切り替わる操作では、このように使用できます.
    .compose(RxJavaUtils.flowableToMain())
  • RxLifecycleのLifecycleTransformer
  • RxLifecycleはAndroidのライフサイクルに合わせてAppメモリの漏洩を防ぐことができ、その中でLifecycleTransformerを使用しています.同じことができるRxLifecycleのようなものも作ったことを知っています.
  • RxJavaの使用を追跡
  • https://github.com/fengzhizi7...
    もし私の文章があなたに役に立つなら、いいねを押して励ましてください(^^)