`

Android之 UI主线程

 
阅读更多

在一个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主线程与子线程深入分析

    在Android应用程序开发中,理解和掌握UI主线程与子线程的使用至关重要,因为它们直接影响到应用的性能和用户体验。UI主线程,也称为应用程序主线程或活动线程,是每个Android应用的核心部分,主要负责处理用户界面的...

    android 主线程给子线程发送消息

    在Android应用开发中,主线程(也称为UI线程)主要负责处理用户界面的更新和交互,而子线程则通常用于执行耗时的操作,如网络请求、数据库操作等,以避免阻塞主线程,保证用户界面的流畅性。本示例"android 主线程给...

    android主线程、子线程及线程间通信方式测试app

    本文将深入探讨Android主线程(也称为UI线程)、子线程以及它们之间的通信方式,结合"android主线程、子线程及线程间通信方式测试app"的描述,我们将详细分析相关知识点。 1. **Android主线程**:主线程是应用程序...

    Android的线程使用来更新UI

    在Android系统中,由于主线程(也称为UI线程)主要负责处理用户界面的绘制和交互,因此直接在主线程中执行耗时操作会导致应用程序无响应(ANR,Application Not Responding),严重影响用户体验。为了解决这个问题,...

    android demo,主线程handle

    在Android开发中,`主线程`(也称为UI线程)是应用程序的入口点,负责处理用户交互和更新用户界面。`Handle` 和 `Runnable` 是Android多线程编程中的重要概念,它们允许开发者在不同的线程之间同步数据和执行任务。`...

    子线程更新主线程数据

    在多线程编程中,"子线程更新主线程数据"是一个常见的需求,尤其是在UI界面交互和后台处理相结合的应用中。主线程通常负责用户界面的显示与交互,而子线程则用于执行耗时的任务,避免阻塞主线程,提供良好的用户体验...

    Android 主线程Exception解决方案Demo

    在Android应用开发中,主线程,也被称为UI线程,主要负责处理用户界面的更新和交互。自Android 4.0(API Level 14)开始,系统对主线程进行了严格的限制,禁止在主线程中执行耗时操作,如网络请求、数据库操作或大...

    010_android 之UI线程阻塞及其优化

    在Android开发中,UI线程,也被称为主线程,是负责处理用户交互和绘制界面的线程。当UI线程被阻塞时,应用程序将变得无响应,这可能导致用户界面冻结,严重影响用户体验。本视频教程“010_android 之UI线程阻塞及其...

    Xamarin.Android 非UI线程更新UI

    Android的主线程,或称为UI线程,负责处理用户界面的所有交互,包括绘制和更新视图。如果在非UI线程中直接修改UI元素,系统会抛出`Android.Content.ReceiverNotRegisteredException`或`Java.Lang.RuntimeException: ...

    安卓UI线程和子线程通讯更新UI实例

    在Android应用开发中,UI线程(也称为主线程)负责处理用户交互和绘制界面,而子线程通常用于执行耗时操作,如网络请求、数据处理等。由于Android系统的安全机制,直接在子线程中修改UI是不允许的,因此我们需要通过...

    Android-UI-TimerTask.rar_android_android timetask_android ui

    总结,`Android-UI-TimerTask.rar`中的资料主要讲述了如何利用`TimerTask`和`Timer`来在后台线程安排任务,然后在主线程安全地更新UI,这对于理解Android中多线程与UI交互的重要性有很大帮助。通过合理运用这些工具...

    android 更新 UI 线程 handler

    在Android开发中,更新UI(用户界面)是一个常见的任务,但是由于Android的主线程(也称为UI线程)是负责处理用户交互和绘制界面的,所以直接在后台线程进行UI更新可能会导致程序崩溃或者界面卡顿。为了解决这个问题...

    android demo,实现主线程handle,工作子线程threadHandle的处理

    由于Android系统的安全机制,所有与UI相关的操作必须在主线程中执行,因此我们不能在子线程中直接修改UI组件,否则会引发“CalledFromWrongThreadException”。 2. Handler(处理者): Handler是Android中用于在...

    Android主线程和子线程区别详解

    在Android开发中,理解主线程和子线程的区别至关重要,因为它们在应用程序的运行和UI交互中起到不同的作用。主线程,通常被称为UI线程,是应用启动时默认创建的线程,负责处理用户界面的所有操作,如点击事件、布局...

    子线程接收主线程发送的消息

    在Android开发中,多线程通信是一个至关重要的概念,尤其是主线程(UI线程)与子线程之间的交互。标题“子线程接收主线程发送的消息”涉及到的是Android中的Handler机制,这是一种处理线程间通信的方式。我们首先来...

    android service反馈到主线程更新界面

    在“android service反馈到主线程更新界面”这个主题中,我们主要探讨的是如何利用Service和Handler机制,实现在后台服务中执行任务,并将结果实时反馈到主线程以更新UI。 首先,Service的基本概念是:它是一个没有...

    Android主线程给多个线程发送消息

    "Android主线程给多个线程发送消息"这个主题就围绕如何在主线程与多个工作线程之间有效地通信。 首先,我们来看一下关键的两个组件:`Handler`和`Looper`。`Handler`(处理器)是Android中用于异步消息处理的类,它...

    主线程控制ProgressDialog的可见性

    每个Android应用的主线程都有一个与之关联的Looper,通过调用Looper.prepareMainLooper()和Looper.loop()初始化。当主线程启动后,Looper会进入一个无限循环,不断从消息队列中取出消息并分发。 `Handler`是Android...

    利用Handler来更新android的UI

    `Handler`是Android系统提供的一种机制,用于在主线程中执行UI更新,确保更新操作不会在其他线程中进行,避免出现线程安全问题。本篇将深入探讨如何利用`Handler`来更新Android的UI,并结合源码分析其工作原理。 `...

Global site tag (gtag.js) - Google Analytics