Ниже приведены фрагменты GameActivity
и GameView
в моем проекте: GameActivity.kt
class GameActivity : Activity() {
private var gameView: GameView? = null
// We override the oncreate to add the gameview which will be showing the game
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var display = windowManager.defaultDisplay
val size = Point()
display.getSize(size)
gameView = GameView(this, size)
setContentView(gameView)
}
}
GameView.kt
class GameView(context: Context, private val size: Point) : SurfaceView(context), Runnable {
private val gameThread = Thread(this)
...
private fun prepareLevel() {}
...
private fun update (fps: Long) {
if (RectF.intersects(powerup.position, player.position)) {
Toast.makeText(context, "Powerup intersects", Toast.LENGTH_SHORT).show()
}
}
...
}
Проблема в том, когда происходит пересечение код прерывается со следующей ошибкой:
E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: com.example.sacredanimals, PID: 3367
java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare()
at android.widget.Toast$TN.<init>(Toast.java:390)
at android.widget.Toast.<init>(Toast.java:114)
at android.widget.Toast.makeText(Toast.java:277)
at android.widget.Toast.makeText(Toast.java:267)
at com.example.sacredanimals.GameView.update(GameView.kt:96)
at com.example.sacredanimals.GameView.run(GameView.kt:78)
at java.lang.Thread.run(Thread.java:764)
Я выполнил некоторую отладку, и, вероятно, проблема возникает из-за того, что сообщение Toast должно вызываться в основном потоке, а не в одном из дочерних потоков, как предлагается в ссылка: Невозможно создать тост в потоке, который не вызвал Looper.prepare () Но я не могу решить эту проблему для случая, когда я хочу вызвать Toast.message изнутри SurfaceView