本程序主要功能步骤如下:
1.利用Timer 编写一个倒计时程序,程序使用Timer和TimerTask来完成倒计时
2.同时使用sendMessages方法发送消息
3.在HanleMessage里更新UI。
最原始的代码方式:
1.事件处理方式使用匿名内部类
2.TimerTask实现也使用匿名内部类
缺点:1.代码通用性差 2.阅读性差
private Button button1,button2;
private TextView tv;//显示计时内容
private Handler handler;
private int count=20;//从20起 开始倒计时
private Timer timer;
private TimerTask timerTask;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1=(Button)findViewById(R.id.Button01);
button2=(Button)findViewById(R.id.Button02);
tv=(TextView)findViewById(R.id.TextView01);
doHandler();
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MainActivity.this.startCount();
}
});
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MainActivity.this.stopCount();
}
});
}
//开始计时
private void startCount()
{
timer =new Timer();
timerTask=new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
count--;
Bundle bundle=new Bundle();
bundle.putInt("time", count);
Message msg=new Message();
msg.setData(bundle);
msg.what=0;
handler.sendMessage(msg);
}
};
timer.schedule(timerTask, 1000, 1000);//没隔一秒执行一次
}
//结束计时
private void stopCount()
{
timer.cancel();
}
/**
* doHandler
* */
private void doHandler()
{
handler=new Handler()
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what)
{
case 0:
Bundle bundle= msg.getData();
tv.setText(String.valueOf(bundle.getInt("time")));
break;
default :break;
}
}
};
}
我们可以尝试以下改造
1.:按钮监听事件可以放到一个方法中。消除匿名内部类 实现接口
2.Handler中实现也可以按照上述方法
3.对了TimerTask中执行的定时器任务方法 可以抽象出来放到回调接口里面
因为现实场景中用到定时任务的class会很多,这样只需要实现回调接口即可。
这样可以完全消除内部类了
//新增回调接口
public interface ITaskCallBack {
void taskRun();
}
//TimerTask的子类Task,抽象方法在通过回调接口去实现
public class Task extends TimerTask{
ITaskCallBack callback;
public void setCallback(ITaskCallBack callback) {
this.callback = callback;
}
public Task(ITaskCallBack iTaskCallBack) {
// TODO Auto-generated constructor stub
super();
this.callback=iTaskCallBack;
}
@Override
public void run() {
// TODO Auto-generated method stub
callback.taskRun();
}
}
这样在MainActivity中要实现ITaskCallBack ,Callback,OnClickListener接口
并实现抽象方法
public class MainActivity extends Activity implements Callback,OnClickListener,ITaskCallBack{
private Button button1,button2;
private TextView tv;
private Handler handler;
private int count=20;//从20起 开始倒计时
private Timer timer;
private TimerTask timerTask;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1=(Button)findViewById(R.id.Button01);
button2=(Button)findViewById(R.id.Button02);
tv=(TextView)findViewById(R.id.TextView01);
handler=new Handler(this);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
//开始计时
private void startCount()
{
timer =new Timer();
//这个地方新创建了TimerTask的子类实现了抽象方法
//这里的抽象方法交给回调接口处理,这样就TimerTask的匿名内部类实现消了。
Task task=new Task(this);
timer.schedule(task, 1000, 1000);//没隔一秒执行一次
}
//结束计时
private void stopCount()
{
timer.cancel();
}
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what)
{
case 0:
Bundle bundle= msg.getData();
tv.setText(String.valueOf(bundle.getInt("time")));
break;
default :break;
}
return false;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.Button01:
startCount();
break;
case R.id.Button02:
stopCount();
break;
default:break;
}
}
@Override
public void taskRun() {
// TODO Auto-generated method stub
count--;
Message msg=new Message();
Bundle date = new Bundle();// 存放数据
date.putInt("time", count);
msg.setData(date);
msg.what=0;
handler.sendMessage(msg);
}
}
既然是计时器还可以使用自定义线程嘛,于是可以线程每sleep 1秒发送发送消息触发
显示线程。
修改的代码如下:
1.新增加的线程类
public class TimeThread extends Thread{
private Handler handler;
private int count;
public TimeThread(Handler handler,int count) {
// TODO Auto-generated constructor stub
this.handler=handler;
this.count=count;
}
@Override
public void run() {
// TODO Auto-generated method stub
Bundle bundle=new Bundle();
Message msg=new Message();
while(true)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
--count;
bundle.putInt("time", count);
msg.what=0;
msg.setData(bundle);
handler.sendMessage(msg);
}
}
}
2.Activity类的事件方法:
private void startCount()
{
tt=new TimeThread(handler, count);
tt.start();
}
分享到:
相关推荐
在Android系统中,Handler、Message和Looper构成了一个关键的异步通信机制,即Handler消息处理机制。这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面...
在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI更新和事件处理的同步性。本文将详细介绍`Handler`的几种常见写法,以及如何使用`Handler.Callback`进行消息处理...
当Handler发送一个Message到MessageQueue中时,Looper会捕获并分发这个消息到对应的Handler进行处理。 1. **Handler的创建**: Handler的创建通常有两种方式:匿名内部类和静态内部类。匿名内部类直接在需要使用...
Handler是Android中的一个类,用于发送和处理消息。它通常与Looper和Message配合工作,允许开发者在不同的线程之间传递信息。在主线程(UI线程)中,有一个默认的Looper对象,它持续不断地从消息队列中取出Message并...
在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? ...
首先,Handler是Android中的一个关键组件,它允许我们通过Message对象在不同的线程之间传递数据和执行任务。通常,我们在主线程(UI线程)中创建一个Handler实例,用于接收由其他工作线程发送的消息,并在适当的时间...
在Android系统中,每个线程都有一个与之关联的`Looper`,它是消息队列的循环器,负责取出`Message`并交给相应的`Handler`处理。默认情况下,只有主线程(UI线程)有一个运行的`Looper`。要在线程中使用`Handler`,...
在 Android 应用程序启动时,系统会默认创建一个主线程,也称为 UI 线程,负责处理所有的界面交互和事件分发。如果在主线程中执行耗时操作,如网络请求或大文件读取,会导致 UI 停止响应,出现“应用无响应”(ANR)...
总的来说,通过这个实例,你不仅学会了如何在Android Studio中创建一个简单的计时器应用,还掌握了Handler的基本用法。理解并熟练掌握Handler对于进行Android应用开发至关重要,因为它是处理主线程与子线程通信、...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。这个机制允许开发者在不同的线程之间传递消息,通常用于更新UI或者执行异步任务。下面我们将深入...
【Looper】是Android中的一个类,它在一个线程中循环读取MessageQueue(消息队列),一旦发现有Message,就将其传递给相应的Handler进行处理。每个线程都有自己的Looper,但默认情况下只有主线程(UI线程)有一个...
Looper是运行在一个线程中的循环器,它负责不断地从MessageQueue中取出消息并分发给相应的Handler进行处理。 在创建Handler时,有四个构造函数可供选择,它们分别对应不同的初始化方式。前两个构造函数没有显式指定...
Android 中 Handler 的使用方法和总结 Handler 是 Android 中的一种非常重要的组件,它起到了...因此,在 Android 应用程序的开发中,Handler 是一个非常重要的组件,需要充分利用它来提高应用程序的性能和用户体验。
通常,我们会在主线程(UI线程)中创建一个Handler实例,这样处理的消息就会在这个线程中执行,这对于更新UI是必要的,因为Android只允许主线程操作UI。 `Runnable`是一个接口,它定义了一个单个方法`run()`. 任何...
在上面的代码中,我们首先在 UI 线程中创建了一个 Handler,然后在后台线程中执行了一些操作,并将结果通过 Message 发送给 Handler,Handler 将其处理并将结果显示给用户。 Handler 和 Message 机制是 Android 多...
Handler是Android中的一个关键类,它允许开发者在不同的线程之间发送和处理消息。通常,主线程负责更新UI,而其他工作线程则执行耗时操作。Handler就是连接这两者的桥梁,通过发送Message对象到消息队列,由Looper...
在Android开发中,`Handler`是一个至关重要的组件,它用于处理与UI线程交互的异步消息通信。本文将深入探讨`Handler`的工作原理、如何使用以及它在Android应用程序中的实际应用。 `Handler`机制是Android系统为了...
标题提到的“Android用Handler机制联网获取图片”是一个典型的Android应用开发场景,涉及网络请求、图片下载以及主线程与工作线程间的通信。 首先,我们需要理解Handler、Looper和Message三个核心组件的关系。...
Handler是Android中的一个关键组件,它主要用于处理由Looper对象分发的消息(Message)。当在主线程(UI线程)中创建一个Handler实例时,这个Handler会与当前线程的Looper关联。通过post()或sendMessage()方法发送...
Handler是Android中的一个消息处理类,它主要用来处理运行在主线程中的Message对象。通过创建一个Handler实例并与Looper(消息循环)关联,我们可以发送和处理Message,从而实现在不同线程间的数据传递和回调。 在...