Я пробовал использовать CustomViewModel для сохранения информации при уничтожении Activity и создания при изменении представления.
public class MyViewModel extends ViewModel {
private MutableLiveData<Long> startTime;
public MutableLiveData<Long> getStartTime(){
if(startTime == null) {
startTime = new MutableLiveData<Long>((long) 0);
}
return this.startTime;
}
public void setStartTime(MutableLiveData<Long> startTime) {
this.startTime = startTime;
}
}
Это настраиваемая модель ViewModel для сохранения информации о времени даже после воссоздания Activity.
public class ViewModelActivity extends Activity implements ViewModelStoreOwner, LifecycleOwner{
private static String TAG = "ViewModelActivity";
private MyViewModel model;
private ViewModelProvider.AndroidViewModelFactory viewModelFactory;
private ViewModelStore viewModelStore = new ViewModelStore();
private LifecycleRegistry lifecycleRegistry;
private Chronometer chronometer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewmodel);
chronometer = (Chronometer) findViewById(R.id.chronometer);
if(viewModelFactory == null){
viewModelFactory = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
}
model = new ViewModelProvider(this, viewModelFactory).get(MyViewModel.class);
final Observer<Long> timeObserver = new Observer<Long>(){
@Override
public void onChanged(Long time) {
chronometer.setBase(time);
}
};
model.getStartTime().observe(this, timeObserver);
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.addObserver(new CustomLifeCycleObserver());
lifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);
chronometer.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy");
}
@NonNull
@Override
public ViewModelStore getViewModelStore() {
return viewModelStore;
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}
Вместо использования ViewModelProviders я попытался использовать ViewModelProvider с помощью Google Developer Docs со ссылкой как ниже.
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=en#java
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
макет содержит только хронометр для отображения времени. Однако я не смог решить эту проблему.
java.lang.RuntimeException: Unable to start activity ComponentInfo{wizley.android.playground/wizley.android.playground.viewmodel.ViewModelActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.Lifecycle$State androidx.lifecycle.Lifecycle.getCurrentState()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3333)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3477)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7464)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.Lifecycle$State androidx.lifecycle.Lifecycle.getCurrentState()' on a null object reference
at androidx.lifecycle.LiveData.observe(LiveData.java:190)
at wizley.android.playground.viewmodel.ViewModelActivity.onCreate(ViewModelActivity.java:52)
at android.app.Activity.performCreate(Activity.java:7990)
at android.app.Activity.performCreate(Activity.java:7979)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3308)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3477)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7464)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955)
В других сообщениях они не реализовали LifeCycleOwner, но метод наблюдения ViewModel требует, чтобы LifeCycleOwner был реализован для первого параметра.
Я думаю, что что-то не так, но не смог решить это самостоятельно.