`
superonion
  • 浏览: 128173 次
  • 性别: 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,通常会抛出下面的异常:

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://jinguo.iteye.com/blog/660073

 

 

 

分享到:
评论

相关推荐

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

    下面将详细讲解`Handler`的工作原理以及如何在Android中创建和使用`Handler`进行主线程与子线程的消息传递。 1. **Handler的工作原理**: - `Handler`对象通常在主线程中创建,它与创建它的线程绑定,也就是与UI...

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

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

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

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

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

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

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

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

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

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

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

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

    Android两个子线程之间的通信

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

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

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

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

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

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

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

    Android的线程使用来更新UI

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

    子线程更新主线程数据

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

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

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

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

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

    android主线程和子线程之间消息传递详解

    在Android应用开发中,主线程(也称为UI线程)负责处理用户界面的更新和交互,而子线程(通常是非UI线程)则用于执行耗时操作,如网络请求、文件读写等,以避免阻塞UI。为了在主线程和子线程之间进行有效的通信,...

    android主线程和另一线程互发信息

    在Android应用开发中,线程间的通信是必不可少的,尤其是主线程(UI线程)与工作线程之间的交互。主线程主要负责用户界面的更新和事件处理,而其他线程通常用于执行耗时操作,如网络请求、数据库操作等。`Handler`、...

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

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

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

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

Global site tag (gtag.js) - Google Analytics