Android中多线程的handler与Thread
[size=x-large][size=medium]在新的Android应用中,不允许直接在主线程(UI线程)中执行比较耗时的操作,因此,就提供了子线程编程机制,多线程编程在Java应用中就有,Android中的多线程编程也类似。Android通常分发多个事件给子线程,响应用户的请求;如果放在主线程中的话,界面会出现假死现象,时间到了之后,后台会给界面发出unfortunately……,进而强制关闭程序
在Android应用多线程中,我们往往要使用handler、Thread和Runnable三个类;其实,应用程序启动时,Android首先会开启一个主线程(UI线程),主线程管理布局界面的UI控件,进行事件分发;handler一般是在某个特定的线程里面创建,主要通过handleMessage()方法(注:不是handlerMessage)接收子线程发送的数据(以Message方式),并用此数据配合主线程更新UI(主线程);子线程(继承自Thread)的润()方法中就执行相应的处理,并在处理完成后执行sendMessage(myMessage)方法,以便在子线程对象开启(start()方法)后,供handler的handleMessage()接收。
注:这其中可以用静态整形变量来标示,如:publicstaticintflag=0x1234;
代码:[/size][/size]
packagecom.xzb.digitalclockandthread;
importjava.util.Calendar;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.widget.AnalogClock;
importandroid.widget.TextView;
publicclassMainActivityextendsActivity{
//声明一常数作为判别信息用
protectedstaticfinalintGUINOTTIFIER=0x1234;
privateTextViewtv;
publicAnalogClockac;
publicHandlermyHandler;
publicThreadmyThread;
publicintmyHour;
publicintmyMinutes;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setContentView(R.layout.fragment_main);
tv=(TextView)findViewById(R.id.textView1);
ac=(AnalogClock)findViewById(R.id.analogClock1);
myHandler=newHandler()
{
privateStringtag="Handler";
//注:是handleMessage不是handlerMessage--------------
publicvoidhandleMessage(Messagemsg)
{
//处理信息的方法
Log.i(tag,"handleMessage方法进入了");
switch(msg.what){
caseMainActivity.GUINOTTIFIER:
//在这里处理要TextView对象show时间的事件
tv.setText("当前时间为:"+myHour+":"+myMinutes);
break;
}
super.handleMessage(msg);
}
};
//通过进程来持续取得系统时间
myThread=newLooperThread();
myThread.start();
}
classLooperThreadextendsThread{
privateStringtag="LooperThread";
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
super.run();
try{
do{
//取得系统时间
longtime=System.currentTimeMillis();
//通过Calendar对象来取得小时钟与分钟
finalCalendarmyCalendar=Calendar.getInstance();
myCalendar.setTimeInMillis(time);
myHour=myCalendar.get(Calendar.HOUR);
myMinutes=myCalendar.get(Calendar.MINUTE);
Log.i(tag,"小时为:"+myHour);
Log.i(tag,"分钟为:"+myMinutes);
//让进程休息一秒
Thread.sleep(1000);
//取得时间后发出信息给Handler
MessagemyMessage=newMessage();
myMessage.what=MainActivity.GUINOTTIFIER;
MainActivity.this.myHandler.sendMessage(myMessage);
}while(false);//为LooperThread.interrupted()==false时一直循环
//当系统发出中断信息时停止本循环
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}
}
}
}