`
天天向上1989
  • 浏览: 419264 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多

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

		});
 



分享到:
评论
1 楼 moshav 2015-01-23  
感谢,刚好找到这个方法,用到后一种方式。

相关推荐

    invalidate

    在这种情况下,需要开启新的线程,但不能直接访问View对象,因为这会报android.view.ViewRoot$CalledFromWrongThreadException异常。为了解决这个问题,需要创建一个继承了android.os.Handler的子类,并重写...

    开新线程引发的常见3个异常

    2.android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 3.java.lang.RuntimeException: Can't create handler inside thread ...

    Android 子线程更新UI

    android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 这个异常为何不是 Only the main thread that created a view hierarchy ...

    Android实现在子线程中更新Activity中UI的方法

    本文实例讲述了Android实现在子线程中更新Activity中...ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its

    详解Android UI更新的几种方法

    如果是在WT进行UI的更新,则会抛出异常,android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.(只有创建这个View的原

    Android线程和进程介绍.pdf

    如果在非UI线程中尝试修改UI元素,会抛出`android.view.ViewRoot$CalledFromWrongThreadException`异常。 为了确保用户界面的响应性,避免主线程被长时间阻塞,耗时的操作如网络请求、数据库操作等应当在其他线程中...

    android平台初级错误整理

    7. **ViewRoot$CalledFromWrongThreadException** 这个异常表示你尝试在非UI线程中修改视图组件。Android的UI操作必须在主线程(UI线程)中执行。如果你需要在其他线程中进行更新,可以使用 `runOnUiThread()` 或者...

    android课件

    如果试图在非UI线程中直接修改UI元素,会导致`android.view.ViewRoot$CalledFromWrongThreadException`异常。为了保证UI线程的流畅运行,避免长时间阻塞UI线程是非常重要的,因为一旦UI线程被长时间阻塞(例如超过5秒...

    Android编程中关于单线程模型的理解与分析

    如果尝试在其他线程中直接操作UI,系统会抛出`android.view.ViewRoot$CalledFromWrongThreadException`异常,提示非UI线程不能触碰UI组件。 由于主线程专注于UI的更新,如果在主线程中执行耗时任务,比如网络请求或...

    Android 多线程处理之多线程详解

    如果在其他线程尝试修改UI,系统会抛出`android.view.ViewRoot$CalledFromWrongThreadException`异常。 在Android中,有两种主要方式创建新线程:`Thread`类和`AsyncTask`。不过,本文主要讨论使用`Thread`和`...

Global site tag (gtag.js) - Google Analytics