`
Rainbow702
  • 浏览: 1078199 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类

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失败,也可以采用上面的方法。

转自:http://hi.baidu.com/lbz126/blog/item/de073313ac543fcda6ef3fc7.html

分享到:
评论
1 楼 kstyle 2014-07-11  
 

相关推荐

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

    - **Runnable**:可以直接将Runnable对象提交到主线程的Looper,或者在子线程中执行,然后通过Handler切换回主线程更新UI。这与Handler发送Message类似,但不包含额外的信息,仅执行特定的代码块。 - **TimerTask...

    android中UI主线程与子线程深入分析

    本文较为深入的分析了android中UI主线程与子线程。分享给大家供大家参考。具体如下: 在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 ...

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

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

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    Android-dialog库针对这些需求进行了优化,提供了更简洁的API,允许开发者在子线程中预处理Dialog的相关数据,然后在合适的时候切换到主线程进行显示,避免了阻塞UI。这种设计遵循了Android的异步编程原则,使得代码...

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

    由于Android系统的安全机制,直接在子线程中修改UI是不允许的,因此我们需要通过特定的方式来实现子线程与UI线程之间的通信,以便在子线程完成任务后,能够安全地更新UI。`AndroidUIUpDemo`这个项目应该是一个展示...

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

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

    Android环境下主UI线程与子线程通信机制研究.pdf

    Android中实现子线程与主线程通信的主要机制是通过消息传递。子线程通过Handler、Looper和Message机制来通知主线程进行UI更新。具体来说,子线程会创建一个Message对象,并通过Handler将消息发送到主线程的消息队列...

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

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

    安卓UI线程机制 ,在子线程中访问UI

    在Android系统中,UI线程(也称为主线程)是应用程序与用户交互的主要通道,它负责处理所有的用户界面更新和事件响应。理解Android的UI线程机制至关重要,因为错误地在非UI线程中操作UI组件会导致应用崩溃或出现不...

    Android两个子线程之间的通信

    然而,当这些子线程需要与主线程交互,例如更新UI或共享数据时,就需要进行线程间通信。 Android提供了多种实现子线程间通信的方式: 1. **Handler-Message机制**:这是最常用的一种方式,通过创建Handler对象,一...

    android里如何在子线程中如何更新主线程的控件

    在Android应用开发中,由于Android系统的UI线程安全机制,所有与用户界面交互的操作都必须在主线程中进行。这意味着,如果你在子线程中尝试修改任何UI元素,如文本、图片或者布局,系统会抛出`android.os....

    子线程更新主线程数据

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

    Android的线程使用来更新UI

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

    Android中UI线程与后台线程交互的探讨.pdf

    在进行UI线程与后台线程交互时,务必遵守Android的线程规则,即只有主线程可以修改UI。后台线程中不得直接修改UI控件,否则可能导致ANR(Application Not Responding)错误,影响用户体验。合理使用Handler和...

    Xamarin.Android 非UI线程更新UI

    创建一个Handler实例并将其与主线程Looper关联,然后在非UI线程中通过`Handler.Post`或`Handler.SendMessage`发送一个包含更新UI操作的Runnable或者Message。这样,这些操作会在主线程被执行。 2. **RunOnUiThread*...

    android 更新 UI 线程 handler

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

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

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

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

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

    python主线程与子线程的结束顺序实例解析

    这篇文章主要介绍了python主线程与子线程的结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引用自 主线程退出对子线程的影响 的一段话: 对于...

Global site tag (gtag.js) - Google Analytics