链接地址: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. MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

    MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis ...

  2. 使用libcurl提交POST请求

    最近在学习libcurl,并利用它提交POST请求,可是返回的响应总是无从验证该次POST请求是否成功提交了. 1. 先看下根据firebug提交的一次成功的请求,这里以login我喜欢上的xiami ...

  3. Ubuntu下获取Nexus7的Root权限

    一.准备 下载获取Root权限的工具包. 下载地址: http://downloadandroidrom.com/file/Nexus7/rooting/Nexus7Root.zip 二.解锁 Ubu ...

  4. server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh

    宕机监控报警程序 一.   需求来源 宕机对运维人员来说,最痛苦了.怎样检測一台server是否还在正常执行,假设该server宕机,怎样在第一时间监測到并通知一线运维人员进行维护,最大化降低损失. ...

  5. iOS_词典阵列 按key分组和排序

    // // main.m // SortGroup // // Created by beyond on 14-10-26. // Copyright (c) 2014年 beyond.com All ...

  6. oracle 快照(snapshot) 管理

     ----手工创建oracle 快照 BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); END; / ---删除快照 详细快照信息能够查看视图 ...

  7. 交互设计师谈颠覆式创新 | Think different

    作者:Teambition 交互设计师 樊伟 本文由 Teambition 原创.转载请注明出处,附原文链接 题图:by Ed Chao 我们不需要像主流市场的大公司一样做类似相扑的庞大,而是需要像柔 ...

  8. events模块

    /** * Created by Administrator on 2016/8/3. */ var http = require("http"); //Node 导入文件系统模块 ...

  9. 关于 WP上应用调试时报错“指定的通信资源(端口)”已由另一个应用程序使用 问题

    问题来源 碰到这个问题是调试wp7项目的时候,之前因为安装的是wp8.0的sdk 包括wp7.5所以wp7的也能用,后来不知道怎么回事wp7项目就不能调试了总是显示启动而不是 device或者是虚拟机 ...

  10. String字符串需要掌握的几个问题

    一.两种定义方式的区别: String str = "hello";      先在堆内存中查找是否已经有"hello",若有,将str指向已存在的它即可:若堆 ...