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

android handler 多线程demo(转)

阅读更多

 

 Handler的定义:


   主要接受子线程发送的数据, 并用此数据配合主线程更新UI。当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发。


比如说,你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。


   这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

 

 

 

 

andriod提供了 Handler 和 Looper 来满足线程间的通信。为了研究其中线程机制的问题,写了2个demo:
Demo1:

  1. package com.mp;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. public class MyThread extends Activity {  
  6.     private Handler handler = new Handler();  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         handler.post(new MyRunnable());     
  11.         System.out.println("Oncreate---The Thread id is :"  
  12.                 + Thread.currentThread().getId());  
  13.         setContentView(R.layout.main);  
  14.     }  
  15.     private class MyRunnable implements Runnable {  
  16.         public void run() {  
  17.             System.out.println("Runnable---The Thread is running");  
  18.             System.out.println("Runnable---The Thread id is :"  
  19.                     + Thread.currentThread().getId());  
  20.             try {  
  21.                 Thread.sleep(6000);  
  22.             } catch (InterruptedException e) {  
  23.                 // TODO Auto-generated catch block  
  24.                 e.printStackTrace();  
  25.             }  
  26.         }  
  27.     }  
  28. }  


在这个demo中,整个过程如下:
程序已启动,就把MyRunnable加入到消息队列中,android的handler是异步机制,所以在handler.post(new MyRunnable());  之后,程序会继续执行,所以以后的语句会继续,这时候我们输出Oncreate中的当前线程ID。同时MyRunnable的run方法也在运行,一样输出run方法中的当前线程ID,然后让线程休眠6秒。
demo的结果分析:
1:控制台的输出: Oncreate---The Thread id is :1
                              Runnable---The Thread is running
                              Runnable---The Thread id is :1
2:程序启动后6秒,我们才看到main.xml中的内容(只有一个textview)

这2个结果都表明handler和主线程是同一个线程。如果这时候你做的是一个耗时的操作(比如下载),那么这样是不可行的。
于是,android给我们提供了Looper这样一个类。其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列.

Demo2:

  1. package com.mp;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.HandlerThread;  
  6. public class MyThread2 extends Activity {  
  7.     private Handler handler = null;  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         HandlerThread handlerThread = new HandlerThread("myHandlerThread");  
  12.         handlerThread.start();  
  13.         handler = new Handler(handlerThread.getLooper());  
  14.         handler.post(new MyRunnable());  
  15.         System.out.println("Oncreate---The Thread id is :"  
  16.                 + Thread.currentThread().getId());  
  17.         setContentView(R.layout.main);  
  18.     }  
  19.     private class MyRunnable implements Runnable {  
  20.         public void run() {  
  21.             System.out.println("Runnable---The Thread is running");  
  22.             System.out.println("Runnable---The Thread id is :"  
  23.                     + Thread.currentThread().getId());  
  24.             try {  
  25.                 Thread.sleep(6000);  
  26.             } catch (InterruptedException e) {  
  27.                 // TODO Auto-generated catch block  
  28.                 e.printStackTrace();  
  29.             }  
  30.         }  
  31.     }  
  32. }  



在这个demo中,用到了HandlerThread,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制。于是就有以下结果;
1:控制台的输出: Oncreate---The Thread id is :1
                              Runnable---The Thread is running
                              Runnable---The Thread id is :10
2:程序启动后,我们立刻看到main.xml中的内容。
这样就达到了多线程的结果。

 

分享到:
评论

相关推荐

    androidHandler测试的demo

    通过分析这个`demo`,开发者可以更好地理解Android中的多线程通信机制,并学会在自己的项目中正确、有效地使用`Handler`、`Looper`进行线程间通信。这将有助于提高程序的响应性和用户体验,避免因UI操作不在主线程...

    android多线程demo(很清晰很详细)

    本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...

    Android Handler传值的demo

    在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,...通过熟练掌握`Handler`、`Message`和`Looper`的工作原理,开发者可以更好地控制应用程序的多线程行为,提升程序的响应性和用户体验。

    android 多线程下载demo

    这个"android多线程下载demo"展示了如何利用多线程分段下载一个APK文件,同时实现实时更新UI展示下载进度,并在下载完成后自动跳转到应用安装界面。以下是对这个Demo涉及知识点的详细解释: 1. **多线程下载**:多...

    Android线程操作 handler demo

    此时,Android提供了多种多线程解决方案,其中之一就是Handler机制。本篇将详细讲解如何在Android中使用Handler进行线程间通信。 Handler是Android中处理消息和回调的核心组件,它与Looper和Message紧密配合,实现...

    Android利用handler在线程之间传递代码

    总结来说,Handler机制是Android多线程编程的关键工具之一,它使得开发者能够方便地在线程间传递信息,实现异步处理,确保UI线程不被阻塞,提升用户体验。熟练掌握Handler的使用,对任何Android开发者都至关重要。

    Android多线程详解与Demo

    在Android应用开发中,多线程是至关重要的技术,它能帮助我们实现应用程序的高效运行,提高用户体验。本文将深入探讨Android多线程的使用,包括其原理、常见方法以及如何通过实例进行实践。 首先,我们需要理解...

    android文件多线程下载demo

    Android提供了Handler、Looper、ThreadPoolExecutor等工具来实现多线程。在这个demo中,可能使用了ThreadPoolExecutor,它允许开发者更灵活地控制线程的数量和行为。 在多线程下载过程中,我们需要跟踪每个线程的...

    Android 多线程下载简单demo之Thread

    本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个示例来源于一个CSDN博客,通过访问提供的链接...

    利用Handler在线程之间传递数据

    这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。

    Android HandlerDemo

    而Handler永远都是在UI主线程,这就意味着对一个控件的修改永远只会有一个线程,不会存在多个线程同时修改一个控件。二是方便统一管理,通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。就是另...

    Android源代码:HandlerDemo

    本项目“Android源代码:HandlerDemo”将深入探讨`Handler`机制及其在多线程环境中的应用。 `Handler`、`Looper`和`Message`是Android消息传递模型的三个核心组件。首先,`Looper`是消息循环,它不断地从消息队列中...

    Android开发(个人整理01) 线程Demo源码

    本文将深入探讨Android中的线程及其应用,基于提供的"Android开发(个人整理01) 线程Demo源码"进行讲解。 1. **主线程(UI线程)** Android应用程序的默认执行线程被称为主线程,它负责处理用户交互和UI更新。...

    android 多线程下载 demo

    本示例"android 多线程下载 demo"提供了一个具体的实现,通过代码注释帮助理解多线程在Android中的应用。 多线程是解决CPU密集型任务或I/O操作时提高程序性能的有效手段。在Android系统中,主线程(UI线程)负责...

    android线程handler、message、looperDEMO

    在Android开发中,多线程处理是至关重要的,特别是在UI更新和后台任务执行时。`Handler`、`Message`和`Looper`是Android系统提供的一个关键机制,用于在不同的线程间进行通信,特别是主线程(UI线程)与工作线程间的...

    android 多线程下载器demo

    这个"android 多线程下载器demo"提供了一个易于集成的解决方案,允许开发者轻松地暂停、继续下载,并可自定义下载线程数量以及设置存储路径。 首先,我们来详细了解一下多线程下载的工作原理。传统的单线程下载方式...

    Android 多线程下载的Demo

    这个"Android 多线程下载的Demo"旨在演示如何在Android应用中实现这一功能,并实时更新进度条来显示下载进度。下面我们将深入探讨相关知识点。 1. **线程与进程**:在Android系统中,每个应用程序都有一个独立的...

    android 多线程断点下载及进度实时更新demo

    在Android开发中,多线程断点下载以及进度实时更新是一项重要的技术,它涉及到网络编程、文件操作和UI更新等多个方面。以下是对这个主题的详细解释: **多线程下载**: 多线程下载是为了提高文件下载速度和效率。...

    Android 线程同步Demo

    在Android开发中,多线程是提升应用性能和用户体验的重要手段。然而,如果没有正确地管理线程,可能会引发数据竞争、死锁等问题,这正是线程同步所关注的重点。线程同步是为了确保多个线程在访问共享资源时能按照...

Global site tag (gtag.js) - Google Analytics