私はこのライブラリでは新しいので、ヒントやご提案があれば歓迎する以上です。 は、私が実行しているとlongNetworkOperation偽の方法を実行RxJava2を得た、流れはこれです:Android RxJava2ハンドルオリエンテーションが変更されました
- 観測可能作成します。Observable.just( "STR1")
- 変更の実行スレッド:.subscribeOn(Schedulers.newThreadを( ))
LongRunningProcessを実行しますMapインタフェースを実装します。
.map(new Function<String, String>() { @Override public String apply(String cad){ // cad is the input value Log.d(TAG,"long operation in thread: "+Thread.currentThread().getName()); //output thread name return " longNetworkOperation result => "+doLongNetworkOperation(); //here we do the background operations }})
は、メインスレッドで結果を取得:.observeOn(AndroidSchedulers.mainThreadを())
結果を通知されるオブザーバーを追加します:.subscribe(observer);
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) { Log.d(TAG,"onSubscribe, thread name >> "+Thread.currentThread().getName()); }
@Override
public void onNext(Object value) { Log.d(TAG,"on next, input value:<<"+value.toString()+">> thread name >>"+Thread.currentThread().getName());}
@Override
public void onError(Throwable e) { Log.d(TAG,"error >>"+e.toString()); }
@Override
public void onComplete() {
Log.d(TAG,"onCompleted thread name >> "+Thread.currentThread().getName());
tvRxJava = (TextView) findViewById(R.id.tv_rxjava); //update the reference of tvRxJava.
tvRxJava.setText("process executed..."); //this line does not change the value of the TextView tvRxJava.
}
};
これはデバイスなしの回転と、正常に動作しますが、doLongNetworkOperationはバックグラウンドで実行されている間、あなたは、デバイスを回転させた場合のTextView tvRxJavaが値を更新しません。 新しいインジェクションでさえありません。
tvRxJava = (TextView) findViewById(R.id.tv_rxjava);
RxJava2でAndroidの向きをどのように管理しますか?
これは私のGradleのDEPです:
compile 'io.reactivex.rxjava2:rxjava:2.0.5'//rxjava2
compile 'io.reactivex.rxjava2:rxandroid:2.0.1' //rxjava2 for android
問題は実際にRxJavaではなく、デバイスの向きが変更されたときのデフォルトのアクションは、アクティビティを破棄して再作成することです。新しく作成されたアクティビティのコピーは、古いアクティビティで作成したRxJavaリクエストからデータを受け取る方法がありません。マニフェストに適切なオプションを設定して、アクティビティがオリエンテーションの変更自体を処理できるようにすることで、アクティビティが破棄されるのを防ぐことで、これを回避できます。 – Clyde