Android 哪个是创建视图的原始线程?

Android 哪个是创建视图的原始线程?,android,view,ui-thread,game-loop,Android,View,Ui Thread,Game Loop,我在一个名为GameLoop的类中有这段代码(代码类似于LunarLander示例) 父类是GameView(参考mGame)。 当mGame.update()尝试调用自己的annound方法时 public class GameView extends SurfaceView implements SurfaceHolder.Callback { . . . private void announce(int resId) { synchronized( mSurfa

我在一个名为GameLoop的类中有这段代码(代码类似于LunarLander示例)

父类是GameView(参考mGame)。
mGame.update()
尝试调用自己的
annound
方法时

public class GameView extends SurfaceView implements SurfaceHolder.Callback {

. . .
    private void announce(int resId) {
        synchronized( mSurfaceHolder ) {
            tv_announcement.setText(getContext().getString(resId));
            ObjectAnimator anim = ObjectAnimator.ofFloat(tv_announcement, "alpha", 0, 1);
            anim.setDuration(ANNOUNCE_DURATION).start();
        }
    }
. . .
我得到一个例外:

 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这里有两个线程,UI线程,它运行GameView并拥有SurfaceView,和GameLoop,GameLoop是线程的扩展,只运行更新绘制循环

据我所知,例外情况是,只有UI线程才能触摸文本视图
tv\u公告

但是,
annound
不是在UI线程中运行吗?我错过了什么

以下是宣布后异常的日志:

03-22 07:20:19.096: D/GameView(28250): + update(): state:IDLE, next state:CHOOSE_SIDE
03-22 07:20:19.096: D/GameView(28250): + announce(resId:2131361803)
03-22 07:20:19.096: W/dalvikvm(28250): threadid=10: thread exiting with uncaught exception (group=0xb3040180)
03-22 07:20:19.096: E/AndroidRuntime(28250): FATAL EXCEPTION: Thread-192
03-22 07:20:19.096: E/AndroidRuntime(28250): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.checkForRelayout(TextView.java:6773)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.setText(TextView.java:3306)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.setText(TextView.java:3162)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.setText(TextView.java:3137)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at <package>.GameView.announce(GameView.java:436)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at  <package>.GameView.update(GameView.java:314)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at  <package>.GameView$GameLoop.run(GameView.java:495)
03-22 07:20:19.126: D/GameView(28250): + onWindowFocusChanged(hasWindowFocus:true)
03-22 07:20:19.126: D/GameView(28250): - onWindowFocusChanged()
03-22 07:20:19.096:D/GameView(28250):+update():状态:空闲,下一个状态:选择
03-22 07:20:19.096:D/GameView(28250):+宣布(剩余:2131361803)
03-22 07:20:19.096:W/dalvikvm(28250):threadid=10:线程以未捕获异常退出(组=0xb3040180)
03-22 07:20:19.096:E/AndroidRuntime(28250):致命异常:线程192
03-22 07:20:19.096:E/AndroidRuntime(28250):android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.view.requestLayout(view.java:12675)上
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.view.requestLayout(view.java:12675)上
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.view.requestLayout(view.java:12675)上
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.view.requestLayout(view.java:12675)上
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.view.requestLayout(view.java:12675)上
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.view.view.requestLayout(view.java:12675)上
03-22 07:20:19.096:E/AndroidRuntime(28250):在android.widget.TextView.checkForRelayout(TextView.java:6773)
03-22 07:20:19.096:E/AndroidRuntime(28250):位于android.widget.TextView.setText(TextView.java:3306)
03-22 07:20:19.096:E/AndroidRuntime(28250):位于android.widget.TextView.setText(TextView.java:3162)
03-22 07:20:19.096:E/AndroidRuntime(28250):位于android.widget.TextView.setText(TextView.java:3137)
03-22 07:20:19.096:E/AndroidRuntime(28250):at.GameView.announce(GameView.java:436)
03-22 07:20:19.096:E/AndroidRuntime(28250):at.GameView.update(GameView.java:314)
03-22 07:20:19.096:E/AndroidRuntime(28250):at.GameView$GameLoop.run(GameView.java:495)
03-22 07:20:19.126:D/GameView(28250):+onWindowFocusChanged(hasWindowFocus:true)
03-22 07:20:19.126:D/GameView(28250):-onWindowFocusChanged()
只有创建视图层次结构的原始线程才能接触其 观点

您的错误被抛出,因为您肯定是从非UI线程(可能是从工作线程)修改UI

如果要使用线程中执行的操作或线程中执行的某个进程中的某些信息更新UI,则只能使用:


你如何创建线程。给我代码。你在哪里调用
annound
方法?请确保从UI线程调用它。@sajmon我可能不太清楚。我不会手动创建线程。UI线程是活动线程,GameLoop是线程,因为它扩展了线程。GameLoop是在GameView构造函数上创建的GameView的私有类。@我已经输入代码的fiddler,从GameView(即UI线程)调用了Annound。是的,我尝试使用处理程序运行循环,然后,
annound
没有引发异常。你能解释一下为什么吗?在我的代码中,GameView被认为是工作线程吗?(GameView仅在活动XML布局中实例化)@ilombo我需要此“通知”的logcat@ilombo如果您有相同的错误,您正在从worker thread man修改UI。您已经在某处创建了普通线程(如果您是从线程继承的话),这个类使操作导致相同的错误。谢谢,我现在正在使用一个处理程序并发送一条消息来显示或隐藏textview。
03-22 07:20:19.096: D/GameView(28250): + update(): state:IDLE, next state:CHOOSE_SIDE
03-22 07:20:19.096: D/GameView(28250): + announce(resId:2131361803)
03-22 07:20:19.096: W/dalvikvm(28250): threadid=10: thread exiting with uncaught exception (group=0xb3040180)
03-22 07:20:19.096: E/AndroidRuntime(28250): FATAL EXCEPTION: Thread-192
03-22 07:20:19.096: E/AndroidRuntime(28250): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.view.View.requestLayout(View.java:12675)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.checkForRelayout(TextView.java:6773)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.setText(TextView.java:3306)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.setText(TextView.java:3162)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at android.widget.TextView.setText(TextView.java:3137)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at <package>.GameView.announce(GameView.java:436)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at  <package>.GameView.update(GameView.java:314)
03-22 07:20:19.096: E/AndroidRuntime(28250):    at  <package>.GameView$GameLoop.run(GameView.java:495)
03-22 07:20:19.126: D/GameView(28250): + onWindowFocusChanged(hasWindowFocus:true)
03-22 07:20:19.126: D/GameView(28250): - onWindowFocusChanged()