`
chriszeng87
  • 浏览: 718137 次
  • 性别: 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中的内容。
这样就达到了多线程的结果。

 

分享到:
评论

相关推荐

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

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

    Android HandlerDemo

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

    Android Handler多线程详解

    Android–多线程之Handler 前言  Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,...

    Handler结合thread 异步加载网络图片

    Handler+thread 加载网络图片,是个学习android多线程好Demo

    Android Handler 原理分析及实例代码

    1.多线程更新Ui会导致UI界面错乱 2.如果加锁会导致性能下降 3.只在主线程去更新UI,轮询处理 Handler使用简介 其实关键方法就2个一个sendMessage,用来接收消息 另一个是handleMessage,用来处理接收到的消息 下面...

    Android使用多线程进行网络聊天室通信

    下面的程序Demo是实现一个简单的C/S聊天室的应用,每个客户端该包含两条线程:一条负责生成主界面,响应用户动作,并将用户输入的数据写入Socket对应的输出流中;另一条负责读取Socket对应的输入流中的数据(从...

    android学习笔记之handler消息处理机制1

    以及多个子线程(也叫Worker线程)。 在android中有一个规则:考虑到安全性,子线程不能动态的改变主线程中组件的属性值。 但为了执行一些耗时操作,往往会将它们放在子线程中,执行完毕要更新主线程中的UI,所以就有...

    android多任务下载并显示Demo

    用一个随机数模拟的下载速度,用一个Button可以获取所有下载任务的进度,如果想做显示,即可做一个线程循环调用这个Button所做的处理,用Handler更新即可!

    android Ajax Demo

    //内部实现多线程机制,以回调函数的方式返回 ajaxHandler.post(map, new OnAjaxListener() { //访问出错AjaxError.type 为错误编号 @Override public void Error(AjaxError arg0) { } //开始访问 @Override ...

    Android开发笔记之:Handler Runnable与Thread的区别详解

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能...

    新浪微博开放平台开发-android客户端

    最近不是太忙,花了一些...使用到的技术点包括ListView,自定义ListAdapter,多线程相关的Message,Handler,验证相关的OAuth,用户图片的异步加载。 新浪微博的验证使用的是signpost的OAuth组件,没有使用微博的SDK。

    Android原生实现多线程断点下载实例代码

    各位父老乡亲,我单汉三又回来了,今天为大家带来一个用原生的安卓写的多线程断点下载Demo。 通过本文你可以学习到: SQLite的基本使用,数据库的增删改查。 Handler的消息处理与更新UI。 Service(主要用于下载...

    Android中Handler与Message的简单实例

    但是在android的学习中,经常会在一些demo中看到Handler与Message的一些使用,所以Handler与Message的学习也是有必要了。至于学多少,笔者还是比较坚持自己的看法,“用多少,学多少”,毕竟已经有了AsyncTask如此...

    Yc_demo_countTime:【Android Demo】倒计时

    在 Android 系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。 为了解决这一个问题,Android 制定了一条规则: 只允许 UI 线程来修改 UI 组件的属性等,也就是说必须单...

    PreLoader demo

    android页面启动时,先启动预加载,等界面布局初始化完成后,再取出预加载的结果进行展示。 主要利用到Handler机制中的SyncBarrier特性来实现Message阻滞

    Google Android sdk 开发范例大全 部分章节代码

    4.17 后台程序运行进度提示——ProgressBar与Handler的整合应用 4.18 动态文字排版——GridView与ArrayAdapter设计 4.19 在Activity里显示列表列表——ListView的布局 4.20 以动态列表配置选项——ListActivity与...

    Android AsyncTask的优缺点详解

    Asynctask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html 这里只实现一个小Demo程序,供...

    Android学习系列教程实例.pdf

    Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ........................................................... 2 iOS .........................................

    百度地图毕业设计源码-AsyncTaskDemo:这是一个消息管理Demo,使用异步任务弹出进度条

    这个类允许执行后台操作并在UI界面上发布结果,而不必处理多线程。AsyncTask是围绕Thread和Handler设计的一个辅助类,它不构成一个通用的线程框架。Asynctasks应该用于短作业(最多几秒钟)。 说的简单一点,其实...

Global site tag (gtag.js) - Google Analytics