Android应用开发基础篇(5)-----Handler与多线程

链接地址: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     <Button16         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     <View24         android:layout_width="fill_parent"25         android:layout_height="70px"26          />27 28     <TextView29         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 block103                     e.printStackTrace();104                 }105                 Message msg = new Message();106                 //消息标志107                 msg.what = 1;108                 //发送这个消息109                 handler.sendMessage(msg);110             }111         }112     }113 114 }

好了,运行该程序。

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

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

完成。

时间: 2024-07-29 09:53:40

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

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/16/2354625.html 一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView显示一些内容,如数据.文本,某一行被点击时有相应的提示:能够实现简单的ListView的动态插入和删除. 三.实现 新建工程MyListView,修改/res/lay

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/18/2357093.html 一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不一样. 二.要求 实现一个具有三个标签的选项卡,每个标签使用不同的布局作为内容,当切换不同的标签时向用户发出提示. 三.实现      声明:这个应用需要用到前面一篇

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

转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介 绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的 路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服务

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/20/2360336.html 一.概述 我们知道,Service是Android的四大组件之一.在我看来,Service可以理解为一种在后台运行的服务,但它不是运行在一个独立的线程中,而是运行在主线程里,当程序有比较“繁重”的任务要执行时,就可以把它放在Service中执行.Service也有自己的生命周期,与Activity有点类似,但它没有用户界面,只在后台运行. 二.要求 编写一个带有S

Android应用开发基础篇(9)-----SharedPreferences

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/27/2370319.html 一.概述 对于SharedPreferences,我吧它理解为一种简单的数据库,它可以把数据像文件一样存放在系统里面,也可以读出来,但它存放的只是一些简单的数值对,如key-values的形式.如果某些应用需要在退出时保存一些简单的数据以便再次被打开时恢复所需的数据,那么就可以用SharedPreferences来实现. 二.要求 编写一个简单的应用,要求该应用退

Android应用开发基础篇(13)-----GestureDetector(手势识别)

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/05/2381025.html 一.概述 GestureDetector是一个用于识别手势的类,这里所讲的手势识别,不是模式识别里所讲的手势(用户的手在用摄像头前做的动作)识别,而是说用户的手在触摸屏上做的手势(比如滑动等),它可以识别一般的手势,也可以识别用户自定义的手势. 二.要求 利用GestureDetector.ViewFlipper类实现两个View之间的切换. 三.实现 新建工程M

Android应用开发提高篇(1)-----获取本地IP

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的).好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单.下面的实现只可

Android应用开发进阶篇-场景文字识别

由于研究生毕业项目需要完成一个基于移动终端的场景文字识别系统,虽然离毕业尚早,但出于兴趣的缘故,近一段抽时间完成了这样一套系统.基本的架构如下: 客户端:Android应用实现拍摄场景图片,大致划出感兴趣文字区域,通过socket通信上传服务器端识别; 服务器端:Python server进行socket通信监听,连通后调用文字识别引擎(exe可执行程序),将识别结果返回; 下面是系统运行示例图: 1. 客户端 包含两个Activity,: MainActivity主界面如上图左1,选择拍摄后调