安卓实战项目之计算器
项目源码:
package com.example.counttime;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
//按钮比较多而且每个按钮都需要对应的监听事件,可以使用接口OnClickListener
public class MainActivity extends Activity implements OnClickListener {
private EditText time;
private TextView showtime;
private Button gettime,start,stop;
private int i=0;//用来递减的变量
private Timer timer=null;//创建一个线程
private TimerTask timertask=null;//配合使用这个Timer
private Handler mHandler=new Handler(){
public void handleMessage(Message msg){
showtime.setText(msg.arg1+"");//修改为传递过来的i
startTime();//循环这个函数
}
};
//这个handler是用来接收和发送线程传递的信息
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
}
//初始化一些控控件和监听按钮
private void initview() {
// TODO Auto-generated method stub
time=(EditText)findViewById(R.id.inputtime);
showtime=(TextView)findViewById(R.id.showtime);
gettime=(Button)findViewById(R.id.gettime);
start=(Button)findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
gettime.setOnClickListener(this);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//v.getid()就是继承VIEW下的所有的控件,包括button
switch (v.getId()) {
case R.id.gettime:
showtime.setText(time.getText().toString());//在没有开始倒计时显示最初的总时间
i=Integer.parseInt(time.getText().toString());
break;
case R.id.start:
startTime();
break;
case R.id.stop:
stopTime();
break;
}
}
//开启线程
public void startTime()
{
timer=new Timer();
//重写执行方法
timertask=new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
i--;
Message message=mHandler.obtainMessage();
//obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new
//new需要重新申请,效率低,obtianmessage可以循环利用,也就是实例化一个Message
message.arg1=i;//message类中agr成员是用来存储一个整形变量的
mHandler.sendMessage(message);//发送消息
}
};
timer.schedule(timertask, 1000);//延迟发送这个线程为1s发送一次
}
//停止线程
public void stopTime()
{
timer.cancel();//取消这个进程
}
}
总结:
1.理解了线程的基本含义,子线程的创建,子线程的初始化,子线程如何传递消息,以及了解了message类的使用方法。
2.关于handler这类的理解:http://blog.sina.com.cn/s/blog_77c6324101016jp8.html
http://blog.sina.com.cn/s/blog_6ee33f040101d7bx.html
3.对于代码的规范有了一定的了解,比如代码中先是定义了全局变量用来指定需要的控件 线程 等,而且由于按钮比较多继承了一个OnClickListener的接口,
在后面的方法onClick中利用switch对每个控件进行监听事件,初始化放在方法initview()方法中。