Я пытаюсь написать простую игру с некоторым состоянием (текущий счет игрока, позиция игрока и других жителей мира). Но не состояние хранится в БД или внешне. Это нормально для того, чтобы это было сброшено, когда MainActivity воссоздается.
Я понимаю, что не собираюсь сохранять это состояние в Activity. Предположительно, даже не мой MainActivity.
Так что я могу создать для него подкласс ViewModel.
Теперь, глядя на различные онлайн-примеры, кажется, что я должен получить этот объект ViewModel, выполнив что-то подобное в MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
GameViewModel model = new ViewModelProvider(this).get(GameViewModel.class);
model.addObserver( new Observer() {
public void update(Observable o, Object arg) {
REDRAW WORLD
}
});
}
Моя первая проблема заключается в том, что я получаю
error: no suitable constructor found for ViewModelProvider(MainActivity)
GameViewModel model = new ViewModelProvider(this).get(GameViewModel.class);
. ViewModelProvider не может быть создан с MainActivity как его ViewModelStoreOwner. Но что должно быть ViewModelStoreOwner в моем случае? Это еще один объект, который я должен создать где-нибудь? И в каком объеме?
Второй вопрос: я хочу, чтобы пользовательский ввод обновлял состояние в моей GameViewModel. Но обработчик пользовательского ввода (onTouchEvent) присоединяется к моему GameSurfaceView. (Подкласс GLSurfaceView)
Но, похоже, GameSurfaceView или MainActivity ничего не знают друг о друге. Итак, как GameSurfaceView.onTouchEvent может завладеть моей GameViewModel, на которую есть ссылка в MainActivity?
Это даже предназначено? Или GameViewModel просто предназначен для использования в качестве прокси для хранения информации в другом месте? И если да, то где это где-то еще?
Это все очень запутанно.