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()接收。
注:这其中可以用静态整形变量来标示,如:public static int flag = 0x1234;

代码:
[/size][/size]
package com.xzb.digitalclockandthread;

import java.util.Calendar;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.AnalogClock;
import android.widget.TextView;


public class MainActivity extends Activity {

//声明一常数作为判别信息用
protected static final int GUINOTTIFIER=0x1234;

private TextView tv;
public AnalogClock ac;
public Handler myHandler;
public Thread myThread;

public int myHour;
public int myMinutes;

@Override
protected void onCreate(Bundle savedInstanceState) {
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 = new Handler()
{
private String tag = "Handler";
//注:是handleMessage不是handlerMessage--------------
public void handleMessage(Message msg)
{
//处理信息的方法

Log.i(tag  ,"handleMessage方法进入了");
switch (msg.what) {
case MainActivity.GUINOTTIFIER:
//在这里处理要TextView对象show时间的事件
tv.setText("当前时间为:"+myHour+":"+myMinutes);

break;
}
super.handleMessage(msg);
}
};

//通过进程来持续取得系统时间
myThread =new LooperThread();
myThread.start();

}



class LooperThread extends Thread {

private String tag = "LooperThread";

@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
do{

//取得系统时间
long time = System.currentTimeMillis();

//通过Calendar对象来取得小时钟与分钟
final Calendar myCalendar  = 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
Message myMessage = new Message();
myMessage.what = MainActivity.GUINOTTIFIER;

MainActivity.this.myHandler.sendMessage(myMessage);

}while(false);//为LooperThread.interrupted()==false时一直循环
//当系统发出中断信息时停止本循环
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}


}

猜你喜欢

转载自1580396076.iteye.com/blog/2093857