在Android中有一个名为AnalogClock Widget的时钟对象。此次练习准备在屏幕上方放置模拟时钟,在下方用TextView来模拟电子时钟,将AnalogClock的时间以数字钟形式显示。该练习的难点是:android.os.Handler、java.lang.Thread以及android.os.Message三对象的整合应用,通过产生Thread对象,在进程内同步调用System.currentTimeMillis()取得系统时间,并通过Message对象来通知Handler对象,Handler则扮演联系Activity与Thread之间的桥梁,在收到Message对象后,将时间变量的值显示于TextView中,产生数字时钟的外观与功能。
第1步:编写布局文件main.xml,分别添加一个AnalogClock、一个DigitalClock和一个TextView,以实现整体布局。
第2步:模拟时钟的实现不需要额外代码,只需要在UI中添加即可,其自动显示时间。
具体代码如下所示:
/*定义模拟时钟对象*/
AnalogClock myClock;
/*从XML中获取模拟时钟UI对象*/
myClock=(AnalogClock)findViewById(R.id.Clock);
第3步:数字时钟的实现也不需要额外代码,只需要在UI中添加即可,其自动显示时间。
具体代码如下所示:
/*定义数字时钟对象*/
Digitalclock myDigClock;
/*从XML中获取数字时钟UI对象*/
myDigClock=(DigitalClock)findViewById(R.id.DigitalClock01);
使用线程实现的TextView时钟则需要线程Thread、Handler(发送、处理消息)辅助实现。具体代码如下所示:
import android.os.Handler;
import android.os.Message;
public class Clock extends Activity implements Runnable(public Handler myHandler;
@Override
protected void onCreate (Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onCreate (savedInstanceState);
setContentView(R.layout.gh);
myHandler = new Handler() (
@Override
public void handleMessage(Message msg) (
// TODO Auto-generated method stub
);
Thread myT = new Thread(this);
myT.start();
@Override
public void run()(
//TODO Auto-generated method stub
第4步:实现最终的主程序shizhong,java,因为要另外加载Java的Calendar与Thread对象,
所以需要在onCreate(中构造Handler与Thread两对象,并实现handelMessage(与run0两个方法。主要实现代码如下所示:
/*这里我们需要使用Handler类与Measage类来处理运行线程*/
import android,os.Handler;
→需要使用Java的Calendar与Thread类来取得系统时间*/
importjava.util.Calendar;
import Java.lang. Thread;
public class shizhong extends Activity
/声明一常数作为判别信息用*/
protected static final int GUINOTIFIER = 0x1234;
/*声明两个widget对象变量*/
private TextView mTextView;
public AnalogClock mAnalogClock;
*声明与时间相关的变量*/
public Calendar mCalendar;
public int mMinutes;
public int mHour;
/*声明关键Handler与Thread变量*/
public Handler mHandler;
private Thread mClockThread;
/* Called when the activity is first created.*/
public void onCreate (Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*通过findViewById取得两个widget对象*/
mTextView=(TextView)findViewById(R.id,myTextView);mAnalogClock=(AnalogClock) findViewById(R.id.myAnalogClock);
/*通过Handler来接收运行线程所传递的信息并更新TextView*/
mHandler = new Handler()
public void handleMessage(Message msg)
{
/*这里是处理信息的方法*/
switch (msg.what){
case shizhong.GUINOTIFIER;
/* 在这处理要TextView对象Show时间的事件*/
mTextView.setText(mHour+":"+mMinutes);
break;
super,handleMessage (msg);
);
/*通过运行线程来持续取得系统时间*/
mClockThread-new LooperThread ();
mClockThread.start();
/*改写一个Thread Class用来持续取得系统时间*/
class LooperThread extends Thread{
public void run(){
super.run();
try{
do{
/*取得系统时间*/
long time = System.currentTimeMillis();
/*通过Calendar对象来取得小时与分钟*/
final Calendar mCalendar = Calendar.getInstance();mCalendar.setTimeInMillis(time);
mHour = mCalendar.get (Calendar.HOUR);
mMinutes = mCalendar.get (Calendar.MINUTE);
/*让运行线程休息一秒*/
Thread.sleep(1000);
/*重要关键程序:取得时间后发出信息给Handler*/
Message m = new Message ();
m.what = shizhong.GUINOTIFIER;
shizhong.this.mHandler.sendMessage(m);
)while(shizhong.LooperThread.interrupted()==false);
/*当系统发出中断信息时停止本循环*/
}catch (Exception e
{
e.printStackTrace();
}}}}
最后看效果: