链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/19/2358155.html

一、概述

Handler这个类主要用来发送和处理消息的。它有多个发送消息函数,但只有一个处理消息函数handleMessage()。

二、要求

程序中有两个线程,一个是UI线程,一个是自己创建的线程,在自己创建的线程中发送消息,在UI线程中接收并处理这个消息。

三、实现

不仅是Android,很多其他界面编程都是不允许在其他线程中直接更新UI界面的。因此可以在其他线程中向UI线程发送一些需要更新界面的消息,让UI线程来更新界面。

新建工程MyHandler,修改/res/layout/main.xml布局文件,在里面添加2个Button按钮,1个空的View(主要是作排版用的)和1个文本TextView。完整的main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <Button
8 android:id="@+id/mbutton"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="启动线程"
12 android:textSize="15px"
13 />
14
15 <Button
16 android:id="@+id/sbutton"
17 android:layout_width="fill_parent"
18 android:layout_height="wrap_content"
19 android:text="停止线程"
20 android:textSize="15px"
21 />
22
23 <View
24 android:layout_width="fill_parent"
25 android:layout_height="70px"
26 />
27
28 <TextView
29 android:id="@+id/mtextview"
30 android:layout_width="fill_parent"
31 android:layout_height="wrap_content"
32 android:text=" "
33 android:textColor="#FF0000"
34 android:textSize="50px"
35 android:gravity="center_horizontal"
36 />
37
38 </LinearLayout>

接着修改MyHandlerActivity.java文件,该文件中定义了2个类,1个是mHandler类,继承自Handler类,实现了handleMessage (Message msg)函数。另一个是mThread类,继承自Thread类,实现了run()函数。其他那些在程序中都有详细注释,完整的MyHandlerActivity.java文件如下:

  1 package com.nan.handler;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.os.Message;
7 import android.view.View;
8 import android.widget.Button;
9 import android.widget.TextView;
10
11 public class MyHandlerActivity extends Activity
12 {
13 //线程是否停止标志位
14 private boolean STOP = true;
15 //线程已经启动了几秒
16 private int second = 0;
17
18 private mHandler handler;
19 private mThread thread;
20 private Button mButton;
21 private Button sButton;
22 private TextView mTextView;
23
24 /** Called when the activity is first created. */
25 @Override
26 public void onCreate(Bundle savedInstanceState)
27 {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30
31 handler = new mHandler();
32 thread = new mThread();
33
34 mTextView = (TextView)findViewById(R.id.mtextview);
35 mButton = (Button)findViewById(R.id.mbutton);
36 //设置“启动线程”按钮事件处理
37 mButton.setOnClickListener(new View.OnClickListener()
38 {
39
40 @Override
41 public void onClick(View v)
42 {
43 // TODO Auto-generated method stub
44 //设置标志位
45 STOP = false;
46 //开启新的线程
47 thread.start();
48
49 }
50 });
51 sButton = (Button)findViewById(R.id.sbutton);
52 //设置“停止线程”按钮事件处理
53 sButton.setOnClickListener(new View.OnClickListener()
54 {
55
56 @Override
57 public void onClick(View v)
58 {
59 // TODO Auto-generated method stub
60 //设置标志位
61 STOP = true;
62 }
63 });
64
65 }
66
67 //自己定义的Handler类
68 private class mHandler extends Handler
69 {
70 @Override
71 public void handleMessage (Message msg)
72 {
73 switch(msg.what)
74 {
75 case 1:
76 {
77 //秒数增加
78 second ++;
79 //显示是第几秒
80 mTextView.setText(Integer.toString(second));
81 break;
82 }
83 }
84 }
85 }
86
87 //自己定义的Thread类
88 private class mThread extends Thread
89 {
90
91 @Override
92 //线程启动时执行这个函数
93 public void run()
94 {
95 //一直循环,直到标志位为“真”
96 while(!STOP)
97 {
98 try {
99 //延时1秒
100 Thread.sleep(1000);
101 } catch (InterruptedException e) {
102 // TODO Auto-generated catch block
103 e.printStackTrace();
104 }
105 Message msg = new Message();
106 //消息标志
107 msg.what = 1;
108 //发送这个消息
109 handler.sendMessage(msg);
110 }
111 }
112 }
113
114 }

好了,运行该程序。

点击一下“开启线程”按钮,如下:

再点击一下“停止线程”按钮,发现计数停止了,说明新开启的线程已经退出了。

完成。

Android应用开发基础篇(5)-----Handler与多线程的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. Android应用开发基础篇(3)-----ListView

    一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView ...

  3. Android应用开发基础篇(4)-----TabHost(选项卡)

    一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不 ...

  4. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  5. Android应用开发基础篇(12)-----Socket通信(转载)

    转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络 ...

  6. Android应用开发基础篇(14)-----自定义标题栏

    一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...

  7. Android应用开发基础篇(6)-----Service

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/20/2360336.html 一.概述 我们知道,Service是Android的四大组件之一. ...

  8. Android应用开发基础篇(2)-----Notification(状态栏通知)

    一.概述      Notification这个部件的功能是在状态栏里显示消息提醒,比如有未读的短信或者是未接的电话,那么状态栏里都会有显示,更或者是从某个应用(比如QQ,酷我音乐等等)里按Home键 ...

  9. Android应用开发基础篇(16)-----ScaleGestureDetector(缩放手势检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/11/2390274.html 一.概述 ScaleGestureDetector这个类是专门用来 ...

随机推荐

  1. Android 使用Jsoup解析Html

    想要做一个看新闻的应用,类似Cnbeta客户端的东西.大致思路如下:根据链接获取新闻列表页的html代码,然后解析,找到所有的新闻标题和新闻链接用listView显示,当点击ListView的Item ...

  2. 经常使用的DB2命令(2)

    catalog数据库: catalog indirect: db2 catalog database on /db2sys[dir_name] catalog remote:    db2 catal ...

  3. golang 并发之协程及通道

    一.概述 在golang中,每个并发执行单元称为goroutine,当程序启动时,main函数在一个单独的goroutine中运行,(main goroutine).新的goroutine会用go语句 ...

  4. 利用Socket实现的两个程序的通信

    写的也很简单,自己觉得挺有意思了 程序如图 主要代码 public class Message { Form1 mainfrom = null; public Message() { } public ...

  5. CSS Sprite小图片自动合并工具

    css-sprite是将css样式中零星的小图标,小图片合并成大图显示,这样能减小服务器并发连接数,减小服务器负载和带宽使用,有很高的实用价值.这里介绍一些自动合并图片并生成样式的工具. NodeJS ...

  6. nodejs教程:安装express及配置app.js文件

    express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.下面简单来说说express的安装和app.js文件的配置,然后在今后的教程中一步一步使用express.js搭建个 ...

  7. Web定时执行某个方法-网页获取

    实现该功能用到的是System.Timers.Timer 将定时的方法添加到Global.ascx.cs中 public class Global : System.Web.HttpApplicati ...

  8. 制作U盘启动盘(以CentOS6.3为例)

    借助UltraISO(软碟通),自己百度下载一个即可(同样适用于制作Windows启动盘). 选择文件→打开,选择ISO镜像所在目录,如下两幅图所示:

  9. TCP的流量控制

    TCP协议作为一个可靠的面向字节流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 要区分TCP的流量控制和拥塞控制: 流量控制是发送方的发送数据的速 ...

  10. easyui给select控件绑定change事件

    一般的做法是使用jQuery来绑定,例如: $("#id").change(function(){ alert("change事件绑定"); }); 当给sel ...