`

android的线程特点

 
阅读更多

         android的view和ui组件不是线程安全的,所以android不允许开发者启动线程访问用户界面中的ui组件,这是就额外定义一个handler来处理对ui组件的操作。。。

 

Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

  1. 发送、接受、处理消息–消息队列;
  2. 启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:

  1. post()  将一个线程加入线程队列;
  2. sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

 

 

 

  • public class HandlerActivity extends Activity {  
  •       
  •     Button btnStart,btnEnd;  
  •     ProgressBar proBar;  
  •       
  •     /** Called when the activity is first created. */  
  •     @Override  
  •     public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •         setContentView(R.layout.main);  
  •           
  •         //通过控件的ID来实例化控件对象  
  •          btnStart = (Button)findViewById(R.id.start);  
  •         btnEnd = (Button)findViewById(R.id.end);  
  •         proBar = (ProgressBar)findViewById(R.id.pBar);  
  •           
  •         //开始按钮触发事件  
  •         btnStart.setOnClickListener(new View.OnClickListener() {  
  •               
  •             @Override  
  •             public void onClick(View v) {  
  •                 proBar.setVisibility(View.VISIBLE);  
  •                 updateBarHandler.post(updateBarThread);  
  •             }  
  •         });  
  •           
  •         //结束按钮触发事件  
  •         btnEnd.setOnClickListener(new View.OnClickListener() {  
  •               
  •             @Override  
  •             public void onClick(View v) {  
  •                 updateBarHandler.removeCallbacks(updateBarThread);  
  •             }  
  •         });  
  •     }  
  •       
  •       
  •      //创建一个Handler对象  
  •      Handler updateBarHandler = new Handler(){  
  •   
  •         @Override  
  •         public void handleMessage(Message msg) {  
  •             proBar.setProgress(msg.arg1);  
  •             updateBarHandler.post(updateBarThread);  
  •         }  
  •           
  •     };  
  •       
  •     //更新ProgressBar的线程对象  
  •     Runnable updateBarThread = new Runnable() {  
  •         int i = 0;  
  •         @Override  
  •         public void run() {  
  •             ii = i + 10;  
  •             Message msg = updateBarHandler.obtainMessage();  
  •             msg.arg1 = i;  
  •             try{  
  •                 Thread.sleep(2000);  
  •             }catch (InterruptedException e) {  
  •                 e.printStackTrace();  
  •             }  
  •             updateBarHandler.sendMessage(msg);  
  •             if(i == 100){  
  •                 updateBarHandler.removeCallbacks(updateBarThread);  
  •             }  
  •         }  
  •     };  
  • }  
  •  

    在主线程HandlerActivity中,通过Handler对象将updateBarThread子线程对象添加到主线程的队列中,并不是另外开启了一个新的线程去执行。

    分享到:
    评论

    相关推荐

      android 线程通信学习

      本教程将深入探讨Android线程通信的基本概念、常用方法以及如何通过Demo来实践这些技术。 一、Android线程基础 Android系统的主要线程被称为“主线程”或“UI线程”,负责处理用户界面的交互事件,如触摸事件、...

      Android开发经验谈:并发编程(线程与线程池)(推荐)

      Android中有多种类型的线程池,如FixedThreadPool、CachedThreadPool、SingleThreadPool、ScheduledThreadPool等,每种线程池都有其特点和应用场景。 要创建一个线程池,需要了解几个重要的参数,如corePoolSize、...

      android线程的使用

      IntentService的特点是每个请求都在单独的工作线程中运行,请求之间是串行的,适用于执行一系列独立但需要后台执行的任务,例如下载文件。 网络操作在Android中通常涉及HTTP请求,早期使用HttpURLConnection,但...

      Android多线程处理 详解

      **Android线程:** 默认情况下,所有的组件(如Activity、Service)都在主线程中运行。这意味着任何阻塞性或耗时的操作都可能影响到UI的响应速度,甚至导致“应用程序无响应”(ANR)的错误提示。 #### 二、Android...

      android_线程间的通信 详细

      ### Android线程间通信详解 #### 一、引言 Android应用开发中,线程间的通信是一项非常重要的技术。为了确保应用的响应性和流畅性,通常会将一些耗时的操作(比如网络请求、数据库访问等)放到后台线程中执行,而...

      浅谈Android中多线程切换的几种方法

      Android中多线程切换的几种方法包括Thread、ThreadPool、Runnable、Callable、Future、Condition、Handler等,每种方法都有其特点和适用场景,开发者需要根据实际情况选择合适的方法来实现多线程切换。

      线程安全单例

      - 通过这种方式,单例对象仅在首次调用 `getInstance()` 时创建,这符合“懒汉式”单例的特点,即实现了延迟加载,提高了程序的性能。 - 相比于早期的“饿汉式”(静态字段直接初始化)实现,这种方式在单例对象未...

      Android线程管理之ActivityThread

      ActivityThread在Android线程管理中扮演着核心角色,它是每个应用程序的主入口点,负责协调与系统服务之间的通信,尤其是与ActivityManagerService(AMS)的交互。 1. **线程通信**: 在Android中,线程间的通信...

      Android-结巴分词的Android版本

      2. 多线程支持:考虑到Android应用的UI线程不能长时间阻塞,分词操作可能需要在后台线程执行,以保持界面的流畅性。 3. 性能优化:可能采用了更高效的编码和解码策略,减少CPU和内存的消耗。 4. 兼容性:对不同的...

      Android多线程与消息循环.pdf

      在给定文件中,虽然提供了关于“Android多线程与消息循环”的标题与标签,但是实际内容却是关于“真空铸造过程中污染物回收净化装置”的制作与技术方案。由于这部分内容与Android开发无关,将专注于所提供的内容,即...

      VB for Android12.12

      5. **多线程编程**:VB在Android平台上同样需要处理多线程问题,理解如何在Android环境下创建并管理线程,确保应用的高效运行。 6. **调试与测试**:学习使用VB for Android提供的调试工具,进行应用的错误检查和...

      android实战 Android应用市场(android studio源程序工程)

      在移动开发领域,Android以其开源、灵活的特点,成为了全球范围内开发者广泛使用的平台。本资源提供了一个实际的Android应用市场项目源码,非常适合初学者进行深入学习。这个项目是基于Android Studio构建的,...

      Android Handler机制解析

      Android线程,一般地就是指Android虚拟机线程,而虚拟机线程是由通过系统调用而创建的Linux线程。纯粹的的Linux线程与虚拟机线程区别在于虚拟机线程具有运行Java代码的runtime。在Android 中当担也就对应一个类。 ...

      Android-Lemon一个简单轻量级的AndroidSocket框架

      `Android-Lemon`框架针对这些痛点进行了优化,主要特点如下: - **简单易用**:提供简洁的API,通过几行代码即可完成Socket连接和数据交互。 - **线程管理**:自动处理网络IO的异步操作,避免阻塞主线程,保证用户...

      Android-ANR-WatchDog一个用于检测AndroidANR(应用不响应)的watchdog

      以下是`Android-ANR-WatchDog`的一些关键特点和使用方法: 1. **自定义超时**:开发者可以设置一个自定义的超时时间,超过这个时间限制,若主线程未进行任何操作,看门狗就会认为出现了ANR。 2. **异常处理**:当...

      android udp通讯

      首先,理解UDP协议的特点至关重要。与TCP(Transmission Control Protocol)相比,UDP不建立连接,不保证数据的可靠传输,没有拥塞控制,因此它的传输速度相对较快。在Android中,使用Java的Socket API或特定的...

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

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

      Android-PLog是一个Android专用的日志封装库

      3. **功能强大**:除了基本的日志输出,`Android-PLog`还支持颜色标记、时间戳、线程信息、堆栈追踪等功能,这在调试过程中非常实用。此外,它还支持多标签日志,便于分类管理大量的日志信息。 4. **性能优化**:...

    Global site tag (gtag.js) - Google Analytics