Как использовать Toast-сообщение изнутри SurfaceView внутри GameActivity? - PullRequest
0 голосов
/ 20 июня 2020

Ниже приведены фрагменты 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

1 Ответ

1 голос
/ 20 июня 2020

Toast.makeText () следует вызывать только из потока Main / UI. Looper.getMainLooper () поможет вам в этом:

Handler(Looper.getMainLooper()).post { 
     Toast.makeText(context, "Powerup intersects", Toast.LENGTH_SHORT).show()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...