`
chenhaodejia
  • 浏览: 115591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android主线程与子线程的关系

阅读更多

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

 

:博客涉及的源码请在千寻资源库www.qxzyk.com 下载获取,谢谢支持。

分享到:
评论

相关推荐

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

    通过上述步骤,你可以实现Android主线程与子线程之间的有效通信。在实际开发中,`Handler`常常与`AsyncTask`、`IntentService`、`Runnable`等结合使用,构建复杂的异步处理逻辑。`MyHandler2`可能是这个示例中的具体...

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

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

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

    总之,Android主线程和子线程之间的主要区别在于它们的职责和交互方式。主线程专注于维护UI的响应性,而子线程用于执行后台任务。开发者必须遵循Android的线程规则,正确地在主线程和子线程之间切换,以确保应用的...

    Android两个子线程之间的通信

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

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

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

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

    从主线程发送消息到子线程(准确地说应该是非UI线程) package com.zhuozhuo; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os....

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

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

    主线程去控制子线程wait与notify

    在本文中,我们将深入探讨如何使用主线程来控制子线程的`wait()`和`notify()`操作,以及它们在并发编程中的作用。 首先,`wait()`方法会导致当前线程进入等待状态,直到其他线程调用同一个对象的`notify()`或`...

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

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

    子线程更新主线程数据

    - Looper: 这是Android主线程的一个消息循环,它不断地从消息队列中取出Message并分发给对应的Handler进行处理。 - MessageQueue: 消息队列,存储待处理的消息。 2. iOS中的GCD (Grand Central Dispatch) 和...

    Android 主线程Exception解决方案Demo

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

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

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

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

    总结来说,`android主线程和另一线程互发信息`涉及到Android中的多线程通信机制,主要依赖`Handler`、`Looper`和`Message`。`Handler`负责发送和处理消息,`Looper`负责在一个线程中循环检查消息队列,`Message`则是...

    Android打印主线程所有方法执行时间

    我们知道Android卡顿主要是主线程中有耗时操作导致的,那么我们怎么能方便快捷的获取主线程中的所有耗时方法执行时间呢?今天我们来介绍两个方案 方案一:利用Looper.java中loop()方法的logging.print的特殊关键字...

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

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

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

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

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

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

    Android 线程+View的使用

    在Android开发中,线程和View的交互是十分常见的需求,因为Android的UI操作必须在主线程中进行,而耗时的操作(如网络请求、大数据处理等)则应该放在子线程中。本实例主要探讨如何在子线程中更新View,通过两种方式...

Global site tag (gtag.js) - Google Analytics