我的比赛遇到了麻烦。当SurfaceView的游戏循环运行时,我无法改变我想要显示的元素的可见性。
这是我得到的错误,我猜最后四个错误是连接的,这是主要问题,但我不确定我是否做了更多愚蠢的事情。
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)
这是我想要带来错误的参与方法(SingleGameActivity.java:84)
public static void setInVisLife3C() {
life3C.setVisibility(View.INVISIBLE);
}
我真的很感激能得到的所有帮助! 在此先感谢:)
编辑:
感谢您的快速回复!
以下是代码的重要部分:
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!
如果您需要更多代码来帮助我,请告诉我! :)
答案 0 :(得分:0)
您的应用可以同时运行多个线程。把它们想象成去往同一个地方的多条道路。只允许UI线程或主要道路对UI进行更改,因此如果您在另一个线程中工作,则需要告诉您的应用首先跳回UI线程,然后让您的可见性发生变化。试试这个:
runOnUiThread(new Runnable() {
public void run() {
life3C.setVisibility(View.INVISIBLE);
}
});