在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process。
一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。
在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程。
那么,UI Thread如何和其他Thread一起工作呢?常用方法是:
诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。
例如,在子线程的状态发生变化时,我们需要更新UI。如果在子线程中直接更新UI,通常会抛出下面的异常:
11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
意思是,无法在子线程中更新UI。为此,我们需要通过Handler物件,通知主线程Ui Thread来更新界面。
如下,首先创建一个Handler,来监听Message的事件:
private final int UPDATE_UI = 1;
private Handler mHandler = new MainHandler();
private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}
或者
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}
当子线程的状态发生变化,则在子线程中发出Message,通知更新UI。
mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);
在我们的程序中,很多Callback方法有时候并不是运行在主线程当中的,所以如果在Callback方法中更新UI失败,也可以采用上面的方法。
分享到:
相关推荐
在Android应用程序开发中,理解和掌握UI主线程与子线程的使用至关重要,因为它们直接影响到应用的性能和用户体验。UI主线程,也称为应用程序主线程或活动线程,是每个Android应用的核心部分,主要负责处理用户界面的...
在Android应用开发中,主线程(也称为UI线程)主要负责处理用户界面的更新和交互,而子线程则通常用于执行耗时的操作,如网络请求、数据库操作等,以避免阻塞主线程,保证用户界面的流畅性。本示例"android 主线程给...
本文将深入探讨Android主线程(也称为UI线程)、子线程以及它们之间的通信方式,结合"android主线程、子线程及线程间通信方式测试app"的描述,我们将详细分析相关知识点。 1. **Android主线程**:主线程是应用程序...
c#子线程如何读取及设置主线程ui的值,自己录的一个小视频,方便理解,比较菜鸟的方法,请勿喷!
在Android系统中,由于主线程(也称为UI线程)主要负责处理用户界面的绘制和交互,因此直接在主线程中执行耗时操作会导致应用程序无响应(ANR,Application Not Responding),严重影响用户体验。为了解决这个问题,...
在Android开发中,`主线程`(也称为UI线程)是应用程序的入口点,负责处理用户交互和更新用户界面。`Handle` 和 `Runnable` 是Android多线程编程中的重要概念,它们允许开发者在不同的线程之间同步数据和执行任务。`...
在多线程编程中,"子线程更新主线程数据"是一个常见的需求,尤其是在UI界面交互和后台处理相结合的应用中。主线程通常负责用户界面的显示与交互,而子线程则用于执行耗时的任务,避免阻塞主线程,提供良好的用户体验...
在Android开发中,UI线程,也被称为主线程,是负责处理用户交互和绘制界面的线程。当UI线程被阻塞时,应用程序将变得无响应,这可能导致用户界面冻结,严重影响用户体验。本视频教程“010_android 之UI线程阻塞及其...
在Android应用开发中,主线程,也被称为UI线程,主要负责处理用户界面的更新和交互。自Android 4.0(API Level 14)开始,系统对主线程进行了严格的限制,禁止在主线程中执行耗时操作,如网络请求、数据库操作或大...
Android的主线程,或称为UI线程,负责处理用户界面的所有交互,包括绘制和更新视图。如果在非UI线程中直接修改UI元素,系统会抛出`Android.Content.ReceiverNotRegisteredException`或`Java.Lang.RuntimeException: ...
教程名称: 老罗Android开发视频教程-Android常用UI控件编程【32集】【】Android常用UI控件编程第七集【】Android常用UI控件编程第二十三集【】Android常用UI控件编程第二十九集【】Android常用UI控件编程第二十二...
总结,`Android-UI-TimerTask.rar`中的资料主要讲述了如何利用`TimerTask`和`Timer`来在后台线程安排任务,然后在主线程安全地更新UI,这对于理解Android中多线程与UI交互的重要性有很大帮助。通过合理运用这些工具...
在Android开发中,更新UI(用户界面)是一个常见的任务,但是由于Android的主线程(也称为UI线程)是负责处理用户交互和绘制界面的,所以直接在后台线程进行UI更新可能会导致程序崩溃或者界面卡顿。为了解决这个问题...
### Python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例 #### 背景介绍 在进行GUI程序设计时,一个重要的原则是将用户界面(UI)的操作与其他耗时任务(如网络请求、数据库操作、大量计算等)分离...
在Android开发中,理解主线程和子线程的区别至关重要,因为它们在应用程序的运行和UI交互中起到不同的作用。主线程,通常被称为UI线程,是应用启动时默认创建的线程,负责处理用户界面的所有操作,如点击事件、布局...
由于Android系统的安全机制,所有与UI相关的操作必须在主线程中执行,因此我们不能在子线程中直接修改UI组件,否则会引发“CalledFromWrongThreadException”。 2. Handler(处理者): Handler是Android中用于在...
Apple推荐所有对UI的操作都应该在主线程中进行,以确保界面的流畅和响应性。然而,开发者在编写代码时可能会忽略这一点,导致UI更新在后台线程执行,这可能导致应用崩溃或者界面表现异常。为了解决这个问题,`swift-...
在Android开发中,多线程通信是一个至关重要的概念,尤其是主线程(UI线程)与子线程之间的交互。标题“子线程接收主线程发送的消息”涉及到的是Android中的Handler机制,这是一种处理线程间通信的方式。我们首先来...
在Android系统中,SystemUI是用户界面的核心组成部分,它负责管理状态栏、通知中心、快速设置等关键功能。本文将深入探讨Android 8.1版本的SystemUI源码,介绍其结构、工作原理以及如何利用提供的gradle配置进行开发...