gpt4 book ai didi

java - Android 实现 runOnUiThread

转载 作者:行者123 更新时间:2023-12-01 12:42:07 25 4
gpt4 key购买 nike

我知道有很多类似的问题,但我找不到问题的答案。

我的游戏遇到问题。当 SurfaceView 的游戏循环运行时,我无法更改想要使其可见的元素的可见性。

这是因为只有创建 View 层次结构的原始线程才能触摸其 View ,但我不明白如何修复它......

07-28 19:07:20.913: E/AndroidRuntime(15091): FATAL EXCEPTION: Thread-26727
07-28 19:07:20.913: E/AndroidRuntime(15091):
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that
created a view hierarchy can touch its views.
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4650)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:877)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.view.View.invalidate(View.java:10275)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.view.View.setFlags(View.java:8385)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.view.View.setVisibility(View.java:5531)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
android.widget.ImageView.setVisibility(ImageView.java:1155)
07-28 19:07:20.913: E/AndroidRuntime(15091): at com.coderogden.pongtennis.activities.SingleGameActivity.setInVisLife3C(SingleGameActivity.j ava:84)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
com.coderogden.pongtennis.views.SingleGameView.outOfBounds(SingleGameView.java:319)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
com.coderogden.pongtennis.views.SingleGameView.update(SingleGameView.java:197)
07-28 19:07:20.913: E/AndroidRuntime(15091): at
com.coderogden.pongtennis.other.MainThread.run(MainThread.java:57)

这是代码的重要部分:

Activity-class 包含大量与此类似的方法。

public static void setInVisLife3C() {           
life3C.setVisibility(View.INVISIBLE);
}

这些方法是从我的 SurfaceView 类调用的,例如从这里:

public void outOfBounds() {

// Player's side
if (ball.getY() + ball.getRadius() > box.getBoxBot()) {
playerLives--;
playing = false;
switch (playerLives) {
case 4:
SingleGameActivity.setInVisLife5P();
break;
case 3:
SingleGameActivity.setInVisLife4P();
break;
case 2:
SingleGameActivity.setInVisLife3P();
break;
case 1:
SingleGameActivity.setInVisLife2P();
break;
case 0:
SingleGameActivity.setInVisLife1P();
playerLoses();
break;
}
}
}

此方法是从另一个名为 update() 的方法调用的,该方法也位于 SurfaceView 类中!

然后从主线程(游戏循环)调用 update() 方法:

@Override
public void run() {
Canvas canvas;

while (running) {
canvas = null;

// Try locking the canvas
try {
canvas = this.surfaceHolder.lockCanvas();
if (canvas != null) {
synchronized (surfaceHolder) {
// Update game state here!
this.gameView.update();
More code down here!

如果您需要更多代码来帮助我,请告诉我! :)

最佳答案

好吧,你回答了你自己的问题。您必须使用 runOnUiThread 和 Runnable 来更改非 UI 线程中的 View 。例如:

public static void setInVisLife3C() {           
runOnUiThread(new Runnable() {
@Override
public void run() {
life3C.setVisibility(View.INVISIBLE);
}
});
}

关于java - Android 实现 runOnUiThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25002281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com