Android通过另一个类设置可见性给出了错误

时间:2014-07-28 17:20:46

标签: java android android-layout android-activity

我的比赛遇到了麻烦。当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!

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

1 个答案:

答案 0 :(得分:0)

您的应用可以同时运行多个线程。把它们想象成去往同一个地方的多条道路。只允许UI线程或主要道路对UI进行更改,因此如果您在另一个线程中工作,则需要告诉您的应用首先跳回UI线程,然后让您的可见性发生变化。试试这个:

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