我在自己制作的应用中遇到了这个问题。这是一个简单的游戏,我使用onCreate
方法从Room数据库中加载数据,然后将加载的数据保存在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
的{{1}}。在这里,我只是再次调用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)
会被清除,并且由于无法在测试中遇到,并且无法从PlayConsole获得崩溃报告,因此无法进行检查。知道是什么原因造成的吗?
答案 0 :(得分:0)
我怀疑操作系统由于内存需求而销毁GamaActivity,然后为onActivityResult重新创建它时会发生问题。这是正常的Android活动生命周期的一部分。现在,当发生这种情况时,gameData
将为null,并调用inCreate进行初始化。 onCreate
将再次调用Room函数来填充gameData
,但是由于Room是异步的,它将在填充gameData
之前让onCreate完成。此时,将调用onActivityResult
,由于房间代码尚未完成,gameData
可能仍为空,因此应用程序崩溃。
解决此问题的正确方法是将gameData
从Activity
类中移到Application
类中。这就是它所属的位置,因为数据应该绑定到应用程序,而不是活动。您将必须扩展Application类,并在Application的onCreate中初始化Room数据。只是谷歌“扩展Android应用程序类”的具体说明。这样,数据将在应用程序的生命周期内是安全的。