Android Handler的使用(一)

来源:互联网 发布:javascript的oop写法 编辑:程序博客网 时间:2024/05/23 02:01

转载自:http://www.eoeandroid.com/thread-72298-1-1.html

Handler基本概念:
       Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。 

使用一个例子简单的来介绍一下Handler。
       示例1:一个应用程序中有2个按钮(start、end),当点击start按钮时,执行一个线程,这个线程在控制台输出一串字符串,并且每隔3秒再执行一次线程,直到点击end按钮为止,线程停止。

下图为这个应用程序的界面:




下图为执行程序时控制台的输出:


开发步骤:
       1、 新建一个Android应用程序
       2、 在布局文件中添加2个Button控件标签,并为其设置属性和值
       3、 在Activity中,声明控件变量并根据id获得控件对象
       4、 在Activity中,创建一个Handler对象
       5、 在Activity中,创建一个Runnable对象
       a) 以匿名内部类的方式
       b) 将要执行的操作写在Runnable对象中的run()方法中
       i. 打印出一句话
       ii. 调用Runnable对象的postDelayed()方法
       6、 在Activity中,编写start按钮需要的监听器,并绑定
       a) 在这个监听器的Onclick()方法中,调用Handler的post()方法,将要执行的线程对象放到队列当中。
       7、 在Activity中,编写end按钮需要的监听器,并帮定
       a) 在这个监听器的Onclick()方法中,调用Handler的removeCallbacks ()方法,删除队列当中未执行的线程对象。
b)
下面是Activity的代码:

package com.handlertest1;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class HandlerTest extends Activity {/** Called when the activity is first created. */private Button startBtn = null;private Button endBtn = null;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);startBtn = (Button) findViewById(R.id.start_btn);endBtn = (Button) findViewById(R.id.end_btn);startBtn.setOnClickListener(new startButtonListener());endBtn.setOnClickListener(new endButtonListener());}class startButtonListener implements OnClickListener {@Overridepublic void onClick(View v){handler.post(updateThread );}}class endButtonListener implements OnClickListener {@Overridepublic void onClick(View v){handler.removeCallbacks(updateThread );}}Handler handler = new Handler();Runnable updateThread  = new Runnable() {@Overridepublic void run(){System.out.println("updateThread ");handler.postDelayed(updateThread ,3000);}};}


上面是一个最简单的例子,下面再看另外一个例子。
       示例2:一个应用程序中有一个进度条和一个按钮,当点击按钮后,每隔一秒钟进度条前进一部分。
下图为应用程序的运行效果图


  开发步骤:
        1、 新建一个Android应用程序
        2、 在布局文件中添加一个progressBar和一个Button,并为其设置属性和值
        3、 在Activity中,声明控件变量并根据id获得控件对象
        4、 创建线程对象
        a) 通过匿名内部类的方式
        b) 在编写完了5、6步之后再来继续编写这个线程对象里的操作
        i. 声明一个变量用来设置进度条的进度
        ii. 重写线程类的run方法(),里面编写要执行的操作
        1. 打印一个字符串
        2. 进度条的值增加
        3. 得到一个消息对象
        4. 设置消息对象arg1的值
        5. 让线程休眠一秒钟
        6. 将消息对象放入到消息队列中
        7. 判断,如果进度条的值等于100,则将线程对象从队列中移除。
        5、 创建Handler对象
        a) 与示例1不同的地方是,这里是通过匿名内部类的方式来声明的,而示例1是直接new出来的对象
        b) 重写Handler对象的handlerMessage(Message msg)方法
        i. 这个方法传入了一个Message对象,即消息对象,首先设置进度条的进度(这个值是Messag对象里面的一个成员变量arg1)。
        ii. 将要执行的线程对象放入到队列当中
        6、 编写Button需要的监听器,并绑定
        a) 设置进度条为显示状态
        b) 将要执行的线程对象放入到队列当中

Java代码:

package com.handlertest1;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.ProgressBar;public class ProgressBarHandlerTest extends Activity {private ProgressBar par = null;private Button startBtn = null;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.progressbar_handler);par = (ProgressBar) findViewById(R.id.par);startBtn = (Button) findViewById(R.id.startBtn);startBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v){par.setVisibility(View.VISIBLE);handler.post(r);}});}Handler handler = new Handler() {public void handleMessage(android.os.Message msg){par.setProgress(msg.arg1);handler.post(r);};};Runnable r = new Runnable() {int i = 0;@Overridepublic void run(){System.out.println("Begin Thread");i += 10;Message msg = handler.obtainMessage();msg.arg1 = i;try{Thread.sleep(1000);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}handler.sendMessage(msg);if(100 == i){handler.removeCallbacks(r);}}};}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 双眼杯盘比增大,怎么办 出完精子腰疼怎么办 备孕2年没怀孕怎么办 发现怀孕了不想要怎么办 造影后通而不畅怎么办 脑梗病人晚上闹怎么办 两眼视力差距400怎么办 脑血清颗粒吃多怎么办 脸过敏吃了海鲜怎么办 如果qq密码忘了怎么办 qq密码被盗了该怎么办 qq号被别人盗了怎么办 qq不想让别人用怎么办 买了金科的房子怎么办 蟹爪莲叶子耷拉怎么办 金钻的叶子发黄怎么办 金钻叶子发焦黄怎么办 红钻叶子黄了怎么办啊 绿钻叶子黄斑点怎么办 金钻的叶子卷怎么办 金钻叶子有黑斑怎么办 怀孕60天没有胎心胎芽怎么办 单位不给交社保怎么办 公司没给足产假怎么办 小公司不给产假怎么办 机关不给陪产假怎么办 刚人流后又怀孕怎么办 怀孕50天不想要怎么办 生了孩子不想要怎么办 刚怀孕不想要孩子怎么办 怀孕一周不想要孩子怎么办 怀孕了不想要孩子怎么办 怀上二胎后悔了怎么办 50岁怀了二胎怎么办 老公那方面太强怎么办 被私人医院骗了怎么办 我特别烦我妈怎么办 刚怀孕了有炎症怎么办 怀孕了但有炎症怎么办 20岁脸上肉松弛怎么办 20岁脸部肉松弛怎么办