`
isiqi
  • 浏览: 16492109 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android编程中,发生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回调函数中调用更新界面显示的函数。例如:

  view plaincopy to clipboardprint?

  public class ExampleActivity extends Activity {

  Handler h = null;

  @Override

  public void onCreate(Bundle savedInstanceState){

  h = new Handler(){

  @Override

  public void handleMessage(Message msg){

  // call updateGui method.

  }

  };

  }

  }

  public class ExampleActivity extends Activity {

  Handler h = null;

  @Override

  public void onCreate(Bundle savedInstanceState){

  h = new Handler(){

  @Override

  public void handleMessage(Message msg){

  // call updateGui method.

  }

  };

  }

  }

  在其它的函数中,利用 send族或post族函数向这个h发送或邮寄消息即可。

  解决方案2:利用Activity.runOnUiThread(Runnable)

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

http://www.cnmsdn.com/html/201009/1284080180ID7930.html

分享到:
评论

相关推荐

    问题:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

    在Android开发中,`android.view.ViewRootImpl$CalledFromWrongThreadException` 是一个常见的异常,它通常发生在尝试在非UI线程(主线程)中修改用户界面元素时。这个异常表明,只有创建视图的原始线程(即主线程)...

    开新线程引发的常见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 ...

    invalidate

    * 不能在非UI线程中直接访问View对象,否则会报android.view.ViewRoot$CalledFromWrongThreadException异常。 * 使用多线程时,需要使用Handler或其他机制来更新UI。 invalidate()方法是Android中一种常用的方法,...

    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

    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线程和进程介绍.pdf

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

    详解Android UI更新的几种方法

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

    android平台初级错误整理

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

    拦截android系统异常

    - 由于异常处理是在主线程中进行的,因此在显示对话框或执行其他UI操作时,需要确保在正确的线程中进行,否则可能会出现`Android.view.ViewRootImpl$CalledFromWrongThreadException`的错误。 - 记录异常信息时,...

    Android 倒计时实现源码.zip

    `CountDownTimer`的执行是在后台线程进行的,因此在`onTick`和`onFinish`方法中直接更新UI可能会导致`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。为避免这个问题,你需要在这些方法中使用`...

    android课件

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

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

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

    安卓Android源码——点按钮添加TableRow源码.zip

    4. **运行时动态更新UI**:因为是运行时添加,所以需要确保所有操作都在UI线程上执行,否则可能会抛出`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。可以使用`runOnUiThread()`或者`Handler`来...

    android service toast 01

    然而,Service通常运行在自己的工作线程中,这意味着在Service中直接使用Toast可能会导致`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。为了解决这个问题,有以下两种常见方法: 1. 使用`...

    android的倒计时功能

    Android UI操作必须在主线程(UI线程)中执行,否则会抛出`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。因此,在子线程中进行倒计时计算后,我们需要使用`Handler`或`runOnUiThread`来更新UI。...

    android AsyncTask中更新progressBar

    确保始终在主线程中更新UI,因为直接在后台线程修改UI元素可能会导致 ` android.view.ViewRootImpl$CalledFromWrongThreadException` 错误。同时,考虑到 `AsyncTask` 只能同时运行少量实例,对于大量并发任务,可能...

    Android应用源码之五种效果的Toast-IT计算机-毕业设计.zip

    否则可能会导致`Android.view.ViewRootImpl$CalledFromWrongThreadException`异常。 7. **不同类型的Toast**:五种效果可能包括信息提示、警告、成功状态、错误状态等,每种类型对应不同的图标和颜色,以增强用户...

    android demo,test印_handle_message_obtainMessage,消息处理和函数名和行号的打

    此外,避免在非UI线程中更新UI,否则会导致` android.view.ViewRootImpl$CalledFromWrongThreadException`异常。 了解并熟练掌握Handler机制对于Android开发者来说至关重要,它能够帮助我们实现复杂的异步操作,...

Global site tag (gtag.js) - Google Analytics