`
dengzhangtao
  • 浏览: 677618 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android,UI主线程与子线程

 
阅读更多
在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process的主线程上,所以在默认设置下,service需要开线程来处理I/O等操作。
摘至API guides:
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.


设置<service android:name=".controler.service.PlayerService" android:process=":remote"/>
对服务使用另一个进程,这样在服务里面进行耗时的操作。主线程还是不影响的

        一个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.


service有两种启动方式,一种是直接startservice方式启动,这样启动的service是一个单独运行的,并不会随着activity的关闭而关闭,也就是说这种方式启动的service的生命周期和activity的是没有关联的。还有一种是通过binder的方式吧,这样启动的service的生命周期和activity是相同的,也就是说当activity关闭的时候此service也停止了
分享到:
评论

相关推荐

    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