Handler使用入门

Handler使用入门--北京尚学堂

当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

下面我们通过一个模拟文件下载的这个长耗时操作来做个说明:

1、新建一个项目Lesson27_Handler

2、在MainHandler.java中写如下面内容:

1. packageandroid.basic.lesson27;

2.

3. importandroid.app.Activity;

4. importandroid.app.ProgressDialog;

5. importandroid.content.res.Resources;

6. importandroid.os.Bundle;

7. importandroid.os.Handler;

8. importandroid.os.Message;

9. importandroid.util.Log;

10.importandroid.view.View;

11.importandroid.widget.Button;

12.

13.public classMainHandler extends Activity {

14.

15.       //声明变量

16.       private Button b1;

17.       private ProgressDialog pd;

18.

19.       //定义Handler对象

20.       private Handler handler =new Handler(){

21.               @Override

22.               //当有消息发送出来的时候就执行Handler的这个方法

23.               public void handleMessage(Messagemsg){

24.                      super.handleMessage(msg);

25.                       //只要执行到这里就关闭对话框

26.                      pd.dismiss();

27.               }

28.       };

29.

30.       /** Called when the activity is first created. */

31.   @Override

32.   public void onCreate(Bundle savedInstanceState) {

33.       super.onCreate(savedInstanceState);

34.       setContentView(R.layout.main);

35.

36.       Resources res=  this.getResources();

37.       //查看UI组件所在的线程名

38.       Log.i("tag","onCreate()-->"+Thread.currentThread().getName());

39.

40.       //定义UI组件

41.       b1= (Button)findViewById(R.id.Button01);

42.       //给按钮绑定单击事件监听器

43.       b1.setOnClickListener(new View.OnClickListener(){

44.

45.                       @Override

46.                       publicvoid onClick(View v) {

47.                              //点击按钮后去处理长耗时操作

48.                              processThread();

49.                       }

50.               });

51.    }

52.

53.   private void processThread(){

54.

55.           //构建一个下载进度条

56.           pd= ProgressDialog.show(MainHandler.this, "下载文件", "正在下载……");

57.           Log.i("tag","processThread()-->"+Thread.currentThread().getName());

58.

59.           new Thread(){

60.

61.                   @Override

62.                   public void run(){

63.                          Log.i("tag","run()-->"+Thread.currentThread().getName());

64.                          //在新线程里执行长耗时方法

65.                          longTimeMethod();

66.                          //执行完毕后给handler发送一个空消息

67.                          handler.sendEmptyMessage(0);

68.                   }

69.

70.           }.start();

71.    }

72.

73.    //模拟下载文件的长耗时方法

74.   private void longTimeMethod(){

75.           try {

76.                   Log.i("tag","longTimeMethod-->"+Thread.currentThread().getName());

77.                      Thread.sleep(10000);

78.               } catch (InterruptedException e) {

79.                      e.printStackTrace();

80.               }

81.    }

82.}

复制代码

3、res/layout/main.xml的内容就省略了,你们可以根据程序运行截图和程序代码反推出来布局组件。

4、运行程序查看结果:

这个例子里,在辅助线程的run方法中执行长耗时操作,操作完毕后调用handler.sendEmptyMessage()方法,主线程中的Handler的handleMessage()方法接受到这一消息,并做了就是关闭对话框的处理。

在接下来的例子里,让我们处理一些更复杂的操作来理解和练习Handler的使用方法。

更多Android相关内容请见:www.bjsxt.com

时间: 2024-11-03 21:49:11

Handler使用入门的相关文章

Handler的入门了解

何为Handler Handler是Android为我们提供的一个更新UI的机制,也是一套信息处理的机制,通过他,可以进行发送信息,也可以处理信息.andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换 1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列). 2)Handler: 你可以构造Handler对象来与Looper沟通,以便pu

《Android学习指南》文件夹

转自:http://android.yaohuiji.com/about Android学习指南的内容分类: 分类 描写叙述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不要先看Android的课程,这样会非常累. 1.Android学习指南基础篇 对于有Java基础的朋友,能够通过本分类60讲左右的课程,打下比較坚实的基础. 2.Android学习指南项目实训篇 对于学过"1.Android2.2学习指南基础篇"的朋友,能够通过本分类项目的联系,加深对基础

《Android学习指南》目录

源:<Android学习指南>目录 Android学习指南的内容分类: 分类 描述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不要先看Android的课程,这样会很累. 1.Android学习指南基础篇 对于有Java基础的朋友,可以通过本分类60讲左右的课程,打下比较坚实的基础. 2.Android学习指南项目实训篇 对于学过“1.Android2.2学习指南基础篇”的朋友,可以通过本分类项目的联系,加深对基础知识的理解和熟练运用. 3.Android学习指南提

Android基础入门教程——3.3 Handler消息传递机制浅析

Android基础入门教程--3.3 Handler消息传递机制浅析 标签(空格分隔): Android基础入门教程 本节引言 前两节中我们对Android中的两种事件处理机制进行了学习,关于响应的事件响应就这两种:本节给大家讲解的 是Activity中UI组件中的信息传递Handler,相信很多朋友都知道,Android为了线程安全,并不允许我们在UI线程外操作UI:很多时候我们做界面刷新都需要通过Handler来通知UI组件更新!除了用Handler完成界面更新外,还可以使用runOnUiT

Android入门:Handler简介与实例

转自:http://www.bdqn.cn/news/201303/8038.shtml 1.Handler简介 Handler 为Android操作系统中的线程通信工具,包为android.os.Handler. 与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列.Handler可以通过这两个队列来分别: 发送.接受.处理消息–消息队列: 启动.结束.休眠线程–线程队列: Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消

Nginx入门之两种handler函数的挂载方式

请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 接着上次的文章,今天研究<深入理解Nginx模块开发与架构解析>一书中给出的mytest的例子,发现和 /tengine.taobao.org/book/一书中的例子不甚相同,尤其是在handler函数的挂在方面. 函数的挂载分为两种方式: 一种方式就是按处理阶段挂载;另外一种挂载方式就是按需挂载.tengine.taobao.org 中使用的挂载方式是按处理阶段挂载,而深入理解一书中的挂载方式是按需求挂载. 首先看/tengin

ExtJS+Handler入门显示

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3

JAVA通信系列二:mina入门总结

一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http://www.cnblogs.com/juepei/p/3940396.html Apache Mina 入门实例--创建一个MINA时间服务http://loftor.com/archives/apache-mina-quick-start-guide.html MINA2.0用户手册中文版--系列文

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所