2017-12-18 13 views
-1

に更新されますどのように、私は、画面を回転すると、クロノメーターは、自動的に以前の状態から再開はViewModelに状態が自動的にアクティビティで

public class ChronometerViewModel extends ViewModel { 
    @Nullable 
    private Long mStartTime; 

    @Nullable 
    public Long getStartTime() { 
    return mStartTime; 
    } 

    public void setStartTime(final long startTime) { 
    this.mStartTime = startTime; 
    } 
} 

クロノメーター

Chronometer chronometer = findViewById(R.id.timer); 

ChronometerViewModel viewModel = ViewModelProviders.of(this).get(ChronometerViewModel.class); 
if (viewModel.getStartTime() == null) { 
    long startTime = SystemClock.elapsedRealtime(); 
     viewModel.setStartTime(startTime); 
     chronometer.setBase(startTime); 
    } else { 
     chronometer.setBase(viewModel.getStartTime()); 
    } 
chronometer.start(); 

のViewModelクラスを宣言しました。しかし、構成変更の際にViewModelクラスにタイマーの現在の状態を格納するコードは書きませんでした。状態は自動的にどのように復元されますか?

私はtutorial

編集このGoogleのcodelabs以下午前:私はクロノメーターのsetBase方法で混乱していました。私は自分の状態変数mStartTimeが自動的にクロノメーターウィジェットに表示されていた現在の時刻に更新されていると仮定しました。今私はsetBaseメソッドのドキュメントをチェックしました。 mStartTimeはconfirgurationの変更が続くので、Chronometerが起動した古い値を使用することができます。クロノメーターは実際に再開します。

+0

アプリを実行します([実行構成]プルダウンから[ステップ2]を選択します) –

答えて

0

のViewModelライフサイクルは、構成の変更を生き残ることができるように、Androidは、同じ目的のためにそれを導入し、以下のとおりであるとまではない緩い状態を行いますアクティビティはです。

ご参考までに、この現象のために問題に直面していますか?

ViewModel lifecycle

0

あなたのChronometerViewModel(ViewModelの子)は、アクティビティの向きを変更しても破壊されません。

ViewModelは、アクティビティまたはフラグメントのデータを準備して管理するクラスです。また、アクティビティ/フラグメントと アプリケーションの残りの部分との通信(例えば、ビジネスロジッククラスの呼び出し)を で処理します。

ViewModelは常にスコープ(フラグメント またはアクティビティ)と関連付けて作成され、スコープが有効である限り保持されます。 など。アクティビティの場合は終了します。

つまり、構成変更(ローテーションなど)のためにオーナーが破棄された場合、ViewModelは破棄されません。オーナーの新しいインスタンス は、既存の ViewModelに再接続されます。

は、私はあなたのビューモデルのドキュメントを読むことをお勧め:

関連する問題