【问题标题】:Android error exception: E/AndroidRuntime(15779): android.view.ViewRootImpl$CalledFromWrongThreadException:Android 错误异常:E/AndroidRuntime(15779): android.view.ViewRootImpl$CalledFromWrongThreadException:
【发布时间】:2016-01-21 15:27:21
【问题描述】:

我在运行游戏时不断收到此错误消息:

01-21 16:14:00.911: E/AndroidRuntime(15779): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6373)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:878)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:361)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.ScrollView.requestLayout(ScrollView.java:1483)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:361)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.view.View.requestLayout(View.java:17566)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.TextView.checkForRelayout(TextView.java:6914)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.TextView.setText(TextView.java:4096)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.TextView.setText(TextView.java:3954)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at android.widget.TextView.setText(TextView.java:3929)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at com.gamerscave.corpboss.Game.Overview_Viewupdate(Game.java:305)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at com.gamerscave.corpboss.Game.tick(Game.java:174)
01-21 16:14:00.911: E/AndroidRuntime(15779):    at com.gamerscave.corpboss.game.GameThread.run(GameThread.java:27)

此错误代码是由以下原因引起的:

    public void Overview_Viewupdate(){
    tv1.setText("Balance: " + Maths.coustomFormat(DEFAULT_BIG_NUMBER_PATTERN, bal));
    tv2.setText("Income: " + Maths.coustomFormat(DEFAULT_BIG_NUMBER_PATTERN, inc));
    tv3.setText("Nett worth: " + Maths.coustomFormat(DEFAULT_BIG_NUMBER_PATTERN, NettWorth));
    tv4.setText("Shares: " + sharePercent + "%");
    tv5.setText("Share value: " + ShareVal);
    tv6.setText("Date: " + Date);
}

它在以下位置被调用:

    public void tick(){
    player.tick();

    long elapsed = (System.nanoTime()-startTime)/1000000;

    if(elapsed>1000)
    {
        nextDay(day, year, month);
        System.out.println("New day: " + day);
        startTime = System.nanoTime();
    }

    if(view1){
        Overview_Viewupdate();
    }

}

由于某种原因,它没有在启动时触发。在 init 方法中调用启动更改。从 GameThread 类的 run 方法调用 init 方法。那么如何避免这个错误并且仍然有一个可以工作的游戏线程呢?

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    发生上述错误是因为 Android 不希望其他线程(例如您的计时器)干扰其 GUI。因此,您需要做的是礼貌地要求 Android 为您进行更新。

    public void tick(){
      player.tick();
    
      long elapsed = (System.nanoTime()-startTime)/1000000;
    
      if(elapsed>1000)
      {
        nextDay(day, year, month);
        System.out.println("New day: " + day);
        startTime = System.nanoTime();
      }
    
      if(view1){
          runOnUiThread(new Runnable() {
            public void run(){  
               Overview_Viewupdate(); 
          }   
      });
     }
    
    }
    

    【讨论】:

      【解决方案2】:

      您的问题是您正在非 UI 线程上更新 UI 元素。有几种方法可以解决这个问题。在您的情况下,我认为最好的方法是使用 RunOnUiThread 语句,如下所示(注意,这必须在 Activity 上完成):

      RuOnUiThread(new Runnable() { 无效运行(){ Overview_Viewupdate(); } }); 您的问题是您正在非 UI 线程上更新 UI 元素。有几种方法可以解决这个问题。在您的情况下,我认为最好的方法是使用 RunOnUiThread 语句,如下所示(注意,这必须在 Activity 上完成):

      RuOnUiThread(new Runnable() {
      void run() {
          Overview_Viewupdate();
      }
      });
      

      此代码将替换您当前对 Overview_ViewUpdate 的调用。或者,您可以考虑使用 AysncTask,您的 OnPostExecute 运行 Overview_ViewUpdate(),而您的 doInBackground() 执行必须在后台运行的操作。

      另外,请确保您的 UI 元素是在 UI 线程上创建的。这通常在OnCreateOnStart 中完成。 AddContentView(...)SetContentView(...) 一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2012-06-27
        相关资源
        最近更新 更多