アンドロイドアプリケーションでMVVMを使用していますが、デバイスのローテーションでリクエストとrxJavaを管理したいのですが、AndroidがマルチデバイスのリクエストrxJavaをローテーションデバイスで管理します
これは私がそれを行うことができます方法を知っている私の単純なコードですが、私は私がrxJava
アンドロイドアプリケーションでMVVMを使用していますが、デバイスのローテーションでリクエストとrxJavaを管理したいのですが、AndroidがマルチデバイスのリクエストrxJavaをローテーションデバイスで管理します
これは私がそれを行うことができます方法を知っている私の単純なコードですが、私は私がrxJava
の最新バージョンを使用していることについて、任意のドキュメントとサンプルコード
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_register);
...
Observer<String> myObserver = new Observer<String>() {
@Override
public void onError(Throwable e) {
// Called when the observable encounters an error
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
// Called each time the observable emits data
Log.e("MY OBSERVER", s);
}
};
Observable.just("Hello").subscribe(myObserver);
}
を見つけることができないあなた
グローバル状態は、多くの場合、悪いと/デバッグをテストするコードが硬くなります。サービスは過度の傾向があります。
デバイスをローテーションして継続する場合は、通常はa Loaderを使用します。これはローテーションを継続し、アクティビティを終了すると破棄されます。
私は最近オリエンテーションの変更中に状態を維持するためにuse Loaders together with RxJavaへの可能な解決策について記事を書いています。
フラグメント#setRetainInstance(true)を利用できます。このフラグを設定すると、フラグメントはデバイスの回転後に破棄されず、オブジェクトコンテナとして使用できます。観察可能なこのサンプルを見てください - https://github.com/krpiotrek/RetainFragmentSample
thatsアクティビティはフラグメントではありません –
これは何も変更しません。フラグメントをコンテナとして使用するだけです。サンプルを参照してください - それはちょうどあなたのケースのような活動のためです – krp
問題は何もありません。私は何の断片も持っていませんし、もっと難しい問題を解決するか、この問題を解決するためにフラグメントを使いたいとは思わないでしょう。 –
Androidでの操作は面白いですね。これを行うにはいくつかの方法があります。
1-サービス:サービスを使用して、サービスでネットワーク要求やその他のバックグラウンド操作を処理できます。また、サービスでは、ビジネスロジックをIT部門から分離します。
2ワーカーフラグメント:ワーカーフラグメントは、レイアウトのないフラグメントインスタンスです。ワーカーフラグメントのretainInstanceState
をtrueに設定する必要があります。したがって、方向の変更から断片を救い、バックグラウンド操作を失うことはありません。
なぜワーカーフラグメントですか?retainInstanceState
をレイアウトのあるフラグメントに設定すると、ビューがリークします。あなたは独立した中で、あなたの業務を扱うグローバルシングルトンデータソースクラスを作成することができます。
することは、あなたがsetRetainInstanceState = true
、3-グローバルシングルトンのデータソースとしてワーカー断片としてのViewModelを実装することができMVVM
を使用している場合アプリケーションのActivity/Fragmentライフサイクルのスコープ
4-ローダー:ローダーは方向変更から状態を回復できます。ローダーを使用して操作を処理しますが、ディスクからデータをロードするように設計されており、長時間実行されるネットワーク要求にはあまり適していません。
エクストラ:あなたはあなたの仕事を永続化するためにPath's Priority Job Queue
を使用することができます。 https://github.com/path/android-priority-jobqueue
編集:あなたは、Googleの新しいアーキテクチャコンポーネントを使用せずにデバイスの回転を処理するための私のレポをチェックすることができます。デバイスがバンドルにストアデータを回転させると、あなたが
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
をオーバーライドする必要があります(私は私の答えで指摘Worker Fragment
の一例として。) https://github.com/savepopulation/bulk-action
私たちはそれをどのように処理していないのですか?ローダーでサンプルコードを使って向きを変えて状態を回復することができますか? –
私は、Global Singletonは第3のオプションを選択する際に必須ではないと付け加えたいと思います。データソースインスタンスは、依存性注入を介して渡すこともできます。 – ULazdins
その後、内部のチェック作成
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null){
//saved instance is null
}else{
//get your stored values here
counter = savedInstanceState.getInt("value",0); //here zero is the default value
}
}
と、サーバーからの要求と電話のローテーションで応答を得るまでの状態についてはどうですか? –
booleanを追加してisLoadingをバンドルし、oncreateでチェックすることができます – apk
私がこれをやっているのは、シングルトンクラス(または、savepopulationで説明されている長い生きているObjectを持つことです。しかし、このトリックは、ロードされたデータをBeha viorSubjectを作成し、元のネットワーク要求ではなくアクティビティでそのサブジェクトにサブスクライブします。
この方法:
public class MyNetworkSingleton {
// This static service survives orientation changes
public static MyNetworkSingleton INSTANCE = new MyNetworkSingleton();
private final BehaviorSubject<String> dataSubject = BehaviorSubject.create();
public Observable<String> getData() {
if (!dataSubject.hasValue()) {
refreshData(); // No data is loaded yet, load initial data from network
}
return dataSubject;
}
public void refreshData() {
someDataSourceCall().subscribe(new Observer<String>() {
@Override
public void onError(Throwable e) {
// Remember, this point also needs error handling of some form,
// e.g. propagating the error to the UI as a Toast
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String data) {
dataSubject.onNext(data); // this refreshes the internally stored data
}
});
}
private Observable<String> someDataSourceCall() {
return // some network request here etc. where you get your data from
}
}
、その後:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
Observer<String> myObserver = new Observer<String>() {
@Override
public void onError(Throwable e) {
// Called when the observable encounters an error
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
// Called each time the observable emits data
Log.e("MY OBSERVER", s);
}
};
MyNetworkSingleton.INSTANCE.getData().subscribe(myObserver);
myRefreshButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
// refresh data from network only when button is pressed
MyNetworkSingleton.INSTANCE.refreshData();
}
});
}
この方法では、ネットワークからのデータが、myRefreshButton
(ユーザーが更新ボタンをクリックしたときにロードされた、またはされる必要がある唯一の最初の時間)。
あなたの投稿をチェックし、ローダーを使ってみましょう –
「Observable.Transformer」コードのこの部分に 'Transformer'をどうやってインポートできますか? –