一、Handler 的定义
<1.1>主要接受子线程发送的数据。并用此数据配合主线程更新UI.
解析:当应用程序启动时,Android首先会开启一个主线程(也就是UI线程)。如果此时需要一个耗时的操作,例如:联网读取数据i。或者读取本地较大的文件的时候,你不能把这些操作放在主线程中,如果你在放在主线程中的话,界面就会出现假死现象。 这时呢我们就会需要把这些耗时的操作,放到一个子线程中,因为子线程涉到UI 更新,Android的主线程(Activity也是一个线程)是线程不安全的,也就是说更新UI只能在主线程中,子线程中更新时危险的,Handler就是来解决这个问题。
OnCreat(Bundle savedInstanceState){
super.onCreat(sacedInstanceState);
startButton--listener--onclick{
// 简写
<1.2> handler.post(updateThread);
// 把updateThreat马上加入到handler消息队列中去。
}
endButton--listener--onclick{
<1.3>handler.removeCallbacks(updateThread);
//把回调的接口remove(就会移除handler中的updateThread)
}
}
Handler handler = new Handler();
Runnable updateThread = new Runnsable(){
//这是一个匿名内部类
public void run(){
System.out.println("UpdateThread");
handler.postDelayed(updateThread,3000);
System.out.println("a--->" + System.currentTimeMillis());
//Thread t = new Thread(r) ;
//t.start();
System.out.println("activity--->" + Thread.currentThread().getId());
System.out.println("activityname--->" + Thread.currentThread().getName());
Handler的运行机制
消息队列“先进先出”
updateThread每过3000毫秒就会加到消息队列中去,开始的话消息队列中也会有很多的消息,等执行完了就会把updateThread放到handler中去。
每个Handler就会对应一个消息队列。
}
}
<1.4> Activity属于一个线程,Handler(异步的线程处理机制)是另一个线程,
在执行完 handler.post(updateThread);这个方法就返回了,剩下的就会有Handler线程执行。
两个线程是并行运行的。
<1.5> java中实现线程有两种方法
<1>一种是继承thread类。
<2>实现runnable这个接口。
<1.6>线程运行的4种状态
New
Runnable
Blocked(阻塞)
Dead
<1.7>Bundle 打包mapping
public class TestBarHandler extends Activity {
//声明控件变量
ProgressBar bar = null;
Button startButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的ID得到代表控件的对象,并为按钮设置监听器
bar = (ProgressBar)findViewById(R.id.bar);
startButton = (Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new ButtonListener());
}
//当点击startButton按钮时,就会执行ButtonListener的onClick方法
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
//把线程加入到线程队列中去。
}
}
//使用匿名内部类来复写Handler当中的handleMessage方法
Handler updateBarHandler = new Handler(){
//@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);//取出压入的消息
Bundle bundle = msg.getData();
updateBarHandler.post(updateThread);
System.out.println("test---->" + bundle.getString("test"));
}
};
//线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable(){
int i = 0 ;
//@Override
public void run() {
System.out.println("Begin Thread" + i);
i = i + 10 ;
//有两个队列一个是添加线程的队列。
//一个得到(obtain)一个消息对象,Message类是有Android操作系统提供
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
msg.arg1 = i ;
Bundle bundle = new Bundle();
bundle.putString("test", "test bundle");
msg.setData(bundle);
try {
//设置当前显示睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if( i > 100){
//如果当i的值为100时,就将线程对象从handler当中移除
updateBarHandler.removeCallbacks(updateThread);
System.out.println(">>>>>>");
}else{
updateBarHandler.sendMessage(msg);
//把消息压入到消息队列中。
//就会把msg发送到HandlerMessage消息队列中去,HandlerMessage就会接收。
System.out.println("<<<<<<");
}
}
};
class MyThread extends Thread{
public void run(){
}
}
}