用一个新的线程更新listView的内容,出现如下异常
08-07 22:13:13.336: ERROR/AndroidRuntime(10753): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
一个android程序默认只有一个process,一个process可以有多个Thread,在这些Thread中一个Thread叫做UI Thread,负责UI界面的显示、更新和控件交互。而其他的线程无法直接操作控件和使用控件相关的api,那么如果想在一个新的Thread中的更新控件,该如何操作呢,莫及@_*,在Android程序中我们可以使用Handler来操作,Handler用来处理和操作一个消息队列中的消息,所以我们可以通过向这个消息队列中发送消息来更新UI
1、handler定义
class EHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SnsConstant.LOAD_MORE_STATUS_WHAT:
setListAdapter();
break;
}
}
};
其中switch部分为处理消息部分,setListAdapter为对ui进行操作
2、对象声明
private EHandler handler= new EHandler();
3、发送消息
handler.sendEmptyMessage(SnsConstant.LOAD_MORE_STATUS_WHAT);
从中可以看出,所以我们在非ui线程中发送消息,然后在handler中处理消息,ok,搞定~
在android开发中我们需要充分利用线程及消息队列来处理需要长时间响应的操作,防止ui假死
参考:
http://jinguo.iteye.com/blog/660073
http://developer.android.com/guide/topics/testing/activity_testing.html#UITestTroubleshooting
分享到:
相关推荐
### Android异步处理详解:使用Thread+Handler实现非UI线程更新UI界面 #### 概述 Android系统中,每一个应用程序都运行在一个独立的Dalvik虚拟机进程中。当应用程序启动时,系统会创建一个主线程(MainThread),也...
如果在非UI线程中直接修改UI元素,系统会抛出`Android.Content.ReceiverNotRegisteredException`或`Java.Lang.RuntimeException: Only the original thread that created a view hierarchy can touch its views.`...
在Android开发中,更新UI(用户界面)是一个常见的任务,但是由于Android的主线程(也称为UI线程)是负责处理用户交互和绘制界面的,所以直接在后台线程进行UI更新可能会导致程序崩溃或者界面卡顿。为了解决这个问题...
当需要更新UI时,我们通常会在其他线程创建一个`Handler`对象,并向UI线程的`Handler`发送一个包含更新UI信息的`Message`,这样UI线程就可以安全地处理这些更新。 工具有助于我们更好地管理和调试UI线程。例如,...
Handler是Android中处理消息和线程通信的重要工具,它允许开发者在不同的线程之间发送和处理消息。创建一个Handler实例,然后在子线程中通过这个Handler发送Message,主线程中的Handler会接收到这个Message并执行...
通常用于初始化任务)、`doInBackground()`(在后台线程执行,处理耗时操作)、`onProgressUpdate()`(在UI线程中执行,更新任务进度)和`onPostExecute()`(在UI线程中执行,处理任务结果)。`AsyncTask`简化了线程...
在Android开发中,UI线程,也被称为主线程,是负责处理用户交互和绘制界面的线程。当UI线程被阻塞时,应用程序将变得无响应,这可能导致用户界面冻结,严重影响用户体验。本视频教程“010_android 之UI线程阻塞及其...
Handler通常在UI线程中创建,用于接收和处理由其他线程发送的消息。Message对象用于承载数据,而Handler的`sendMessage()`和`handleMessage()`方法则实现了线程间通信。使用Handler时,一般遵循以下步骤: 1. 在UI...
下面将详细探讨Android线程的使用以及如何在后台线程中处理数据并更新UI。 1. 主线程与UI更新 主线程是Android应用的入口,负责处理所有与UI相关的事件,如触摸事件、键盘输入等。任何对UI的操作,包括添加、删除或...
* 使用默认的构造函数,会将handler绑定当前UI线程的looper。 * 如果想使用多线程这里是不能使用默认的构造方法的。 */ public MyHandler() { super(); } @Override public void handleMessage(Message msg...
通过创建`Handler`、发送消息以及在`handleMessage()`方法中处理消息,我们可以安全地在子线程和UI线程之间进行通信,实现UI的更新。这个例子就是一个典型的使用`Handler`更新UI的场景,它展示了如何在子线程中获取...
在Android开发中,UI线程(也称为主线程)负责处理与用户界面相关的所有操作,如绘制视图、处理触摸事件等。然而,由于Android系统的单线程模型,如果在UI线程中执行耗时操作,如网络请求或大数据处理,会导致应用无...
`Handler`是Android中用于线程间通信的重要工具,特别是在主线程(UI线程)与工作线程之间。它允许开发者发送和处理`Message`或`Runnable`对象,使得在不同线程间传递数据和执行操作成为可能。在描述中提到的进度条...
Handler机制是Android系统中用于处理消息和线程通信的重要组成部分。它主要由四个核心组件组成:`Looper`、`Handler`、`MessageQueue` 和 `Thread`。 #### 二、核心组件解析 1. **Looper** - **定义**:`Looper`...
在Android开发中,`Handler`、`Thread`和`post`方法是实现UI线程与后台线程交互的重要工具。`Handler`类主要用于发送和处理消息,`Thread`用于开启新的执行线程,而`post()`方法则是`Handler`的一个关键函数,常用于...
本篇将详细讲解标题所提及的四种Android更新UI的方法,并结合描述中的"handler"和"thread"两个关键词,深入探讨如何在后台线程处理耗时任务并及时更新UI。 1. 主线程(UI线程) Android应用的主线程主要负责处理与...
为了保证用户体验,Android系统不允许在非UI线程中直接更新UI组件。当需要从网络或其他耗时操作获取数据并更新UI时,必须采取一些策略来确保UI更新操作是在主线程中进行的。本文将详细介绍四种常见的在Android线程中...