发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案

来源:互联网 发布:淘宝卖家怎样收款. 编辑:程序博客网 时间:2024/06/08 01:26

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


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

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


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

 

法1:

在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数

 /**      * 启动线程用来刷新登录提示文字,N秒刷新一次      *       */      private class FreshWordsThread extends Thread      {          @Override          public void run()          {              try              {                  mLoadingWords = "test";                  mLoadhandler.sendEmptyMessage(REFRESH);              }              catch (InterruptedException e)              {                  e.printStackTrace();                  Thread.currentThread().interrupt();              }          }      }            //主线程中的handler      class LoadHandler extends Handler      {          /**          * 接受子线程传递的消息机制          */          @Override          public void handleMessage(Message msg)          {              super.handleMessage(msg);              int what = msg.what;                Log.i(TAG, "Main handler message code: " + what);              switch (what)              {                                  case REFRESH:                  {                      // 刷新页面的文字                      mLoadingText.setText(mLoadingWords);                      break;                  }                }          }              }  

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

 

        FusionField.currentActivity.runOnUiThread(new Runnable()              {                  public void run()                  {                      Toast.makeText(FusionField.currentActivity, "Success",                              Toast.LENGTH_LONG).show();                  }                    });  

     
    0 0