android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

  • A+
所属分类:Android异常

在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是

报异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

【只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)】

也就是说必须在一般必须在程序的主线程(也就是ui)线程中进行更新界面显示的工作。可以采用下面的方法之一来解决。

1、通过Handler:

  1. /** 
  2.      * 启动线程用来刷新登录提示文字,N秒刷新一次 
  3.      *  
  4.      */
  5.     private class FreshWordsThread extends Thread
  6.     {
  7.         @Override
  8.         public void run()
  9.         {
  10.             try
  11.             {
  12.                 mLoadingWords = "test";
  13.                 mLoadhandler.sendEmptyMessage(REFRESH);
  14.             }
  15.             catch (InterruptedException e)
  16.             {
  17.                 e.printStackTrace();
  18.                 Thread.currentThread().interrupt();
  19.             }
  20.         }
  21.     }
  22.     //主线程中的handler  
  23.     class LoadHandler extends Handler
  24.     {
  25.         /** 
  26.          * 接受子线程传递的消息机制 
  27.          */
  28.         @Override
  29.         public void handleMessage(Message msg)
  30.         {
  31.             super.handleMessage(msg);
  32.             int what = msg.what;
  33.             Log.i(TAG, "Main handler message code: " + what);
  34.             switch (what)
  35.             {
  36.                 case REFRESH:
  37.                 {
  38.                     // 刷新页面的文字  
  39.                     mLoadingText.setText(mLoadingWords);
  40.                     break;
  41.                 }
  42.             }
  43.         }
  44.     }

第二种:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用

  1. FusionField.currentActivity.runOnUiThread(new Runnable()
  2.         {
  3.             public void run()
  4.             {
  5.                 Toast.makeText(FusionField.currentActivity, "Success",
  6.                         Toast.LENGTH_LONG).show();
  7.             }
  8.         });

 

 

 

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: