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

来源:互联网 发布:codol激光和握把数据 编辑:程序博客网 时间:2024/05/29 09:14

在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();}});

http://daydayup1989.iteye.com/blog/784831

0 0