2017-03-19 4 views

答えて

2

の最新バージョンを使用していることについて、任意のドキュメントとサンプルコード

@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); 
} 

を見つけることができないあなた

  • なく、あなたの活動のライフサイクルの中に、あなたのロジックを保持しているいくつかのグローバルシングルトン、またはあなたのApplicationクラスを使用します:以下のオプションを持っています
  • 使用したアプリケーション
  • /次のアクティビティに実行されるサービスを使用してローダー

グローバル状態は、多くの場合、悪いと/デバッグをテストするコードが硬くなります。サービスは過度の傾向があります。

デバイスをローテーションして継続する場合は、通常はa Loaderを使用します。これはローテーションを継続し、アクティビティを終了すると破棄されます。

私は最近オリエンテーションの変更中に状態を維持するためにuse Loaders together with RxJavaへの可能な解決策について記事を書いています。

+0

あなたの投稿をチェックし、ローダーを使ってみましょう –

+0

「Observable.Transformer」コードのこの部分に 'Transformer'をどうやってインポートできますか? –

0

フラグメント#setRetainInstance(true)を利用できます。このフラグを設定すると、フラグメントはデバイスの回転後に破棄されず、オブジェクトコンテナとして使用できます。観察可能なこのサンプルを見てください - https://github.com/krpiotrek/RetainFragmentSample

+0

thatsアクティビティはフラグメントではありません –

+0

これは何も変更しません。フラグメントをコンテナとして使用するだけです。サンプルを参照してください - それはちょうどあなたのケースのような活動のためです – krp

+0

問題は何もありません。私は何の断片も持っていませんし、もっと難しい問題を解決するか、この問題を解決するためにフラグメントを使いたいとは思わないでしょう。 –

3

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

+0

私たちはそれをどのように処理していないのですか?ローダーでサンプルコードを使って向きを変えて状態を回復することができますか? –

+1

私は、Global Singletonは第3のオプションを選択する際に必須ではないと付け加えたいと思います。データソースインスタンスは、依存性注入を介して渡すこともできます。 – ULazdins

0

その後、内部のチェック作成

@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 
} 
} 
+0

と、サーバーからの要求と電話のローテーションで応答を得るまでの状態についてはどうですか? –

+0

booleanを追加してisLoadingをバンドルし、oncreateでチェックすることができます – apk

0

私がこれをやっているのは、シングルトンクラス(または、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(ユーザーが更新ボタンをクリックしたときにロードされた、またはされる必要がある唯一の最初の時間)。

関連する問題