Кэш пуст после возвращения действия - PullRequest
0 голосов
/ 25 ноября 2018

У меня проблема с приложением, которое я сделал.Это простая игра, в которой я загружаю данные из базы данных Room моим методом onCreate, сохраняю загруженные данные в List<GameData> gameData и затем запускаю игру.

gameDao.getAll()
    .subscribe(gameDatas -> {
        gameData.addAll(gameDatas);
        startGame();
    });

внутри моего startGame, я выбираю случайным образомчисло в диапазоне [0, gameData.size()] и выполнить какую-либо связанную с игрой работу с соответствующим gameData.

public void startGame(){
    Random random = new Random();
    int randomNumber = random.nextInt(gameData.size());

    // do something with gameData[ramdomNumber]
}

Итак, пользователь продолжает играть, а затем, когда пользователь проигрывает, я отправляю его на GameOverActivity сstartActivityForResult(gameOver,1123)

Внутри GameOverActivity пользователь может

  • перезапустить игру
  • посмотреть объявление, чтобы продолжить игру
  • другой социальный персонал

Поэтому, когда пользователь нажимает кнопку перезапуска, я просто заканчиваю GameOverActivity, который перенаправит меня на onActivityResult из GameActivity.Здесь я просто вызываю метод startGame снова, и он должен предположительно начать новую игру.

Теперь проблема иногда для некоторых устройств, gameData становится пустым, и поэтому я получаю исключение внутри startGame, когда я звоню random.nextInt(gameData.size())

java.lang.RuntimeException: 

  at android.app.ActivityThread.performResumeActivity (ActivityThread.java:3790)

  at android.app.ActivityThread.handleResumeActivity (ActivityThread.java:3830)

  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3038)

  at android.app.ActivityThread.-wrap11 (Unknown Source)

  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1696)

  at android.os.Handler.dispatchMessage (Handler.java:105)

  at android.os.Looper.loop (Looper.java:164)

  at android.app.ActivityThread.main (ActivityThread.java:6944)

  at java.lang.reflect.Method.invoke (Native Method)

  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)

  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Caused by: java.lang.RuntimeException: 

  at android.app.ActivityThread.deliverResults (ActivityThread.java:4491)

  at android.app.ActivityThread.performResumeActivity (ActivityThread.java:3762)
Caused by: java.lang.IllegalArgumentException: 

  at java.util.Random.nextInt (Random.java:388)

  at com.company.game.GameActivity.startGame (GameActivity.java:149)

  at com.company.game.GameActivity.onActivityResult (GameActivity.java:477)

  at android.app.Activity.dispatchActivityResult (Activity.java:7556)

  at android.app.ActivityThread.deliverResults (ActivityThread.java:4487)

Я не преувеличиваюпочему gameData очищается, и я не могу проверить, потому что я никогда не сталкивался во время тестирования, и я получил отчет о сбое из PlayConsole.Есть идеи, что может быть причиной этого?

1 Ответ

0 голосов
/ 25 ноября 2018

Я подозреваю, что проблема возникает, когда ОС разрушает GamaActivity из-за потребностей в памяти, а затем заново создает ее для onActivityResult.Это часть нормального жизненного цикла Android Activity.Теперь, когда это произойдет, gameData будет нулевым, а onCreate вызывается для init.onCreate снова вызовет функцию Room для заполнения gameData, но так как Room асинхронный, он позволит onCreate завершить работу до заполнения gameData.В этот момент будет вызван onActivityResult, а gameData может все еще быть пустым, так как код комнаты еще не завершен, поэтому приложение вылетает.Правильный способ исправить это - переместиться gameData из класса Activity в класс Application.Вот где он принадлежит, поскольку данные должны быть привязаны к Приложению, а не к Деятельности.Вам нужно будет расширить класс Application и в onCreate of Application инициализировать данные комнаты.Просто Google "Расширение класса приложений Android" для конкретных инструкций.Таким образом, данные будут безопасны на протяжении всего жизненного цикла приложения.

...