Android中多线程的handler与Thread

yangaiyu 2014-07-18

[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();

}

}

}

}

相关推荐