Handler 存在 2 个队列, 一个是线程Runnable , 一个是消息Message,
Handler 的作用 可以把 线程 排进 列队中, 然后 先进 先出,
其中 Handler handler = new Handler();
是操作 线程,比如 启动 handler.post(线程) , 杀死 handler.removeCallbacks(线程)
在线程中(Runnable) 可以做 线程中的具体实现某种功能的全部过程,
比如下面这个 是 将 进度条 每 10 秒 前进一次
public class HandlerActivity extends Activity {
/** Called when the activity is first created. */
private Button b_start;
private ProgressBar bar_1;
private int i=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b_start = (Button)findViewById(R.id.bu_start);
bar_1 = (ProgressBar)findViewById(R.id.bar_1);
b_start.setOnClickListener(new StartButtonListener());
bar_1.setMax(100);
}
Handler handler = new Handler(); //管理 线程,执行线程
class StartButtonListener implements OnClickListener{
public void onClick(View v) {
// TODO Auto-generated method stub
handler.post(updateThread); //启动线程
}
}
// java 实现 多线程 使用的 Runable 类 线程的具体功能
Runnable updateThread = new Runnable() {
public void run() {
// TODO Auto-generated method stub
i = i + 10;
bar_1.setProgress(i);//设置进度条的进度值
// 重复延迟 1000 启动 线程 undateThread
handler.postDelayed(updateThread, 1000);
if(i == 100){
Toast.makeText(HandlerActivity.this, "进度条已经到100了", Toast.LENGTH_LONG).show();
handler.removeCallbacks(updateThread); //去掉 线程
}
}
};
}
--------------------------------------------------------------------------------
然后是 message 调用的是 handler 里面的 handleMessage 方法
Handler updateHandler = new Handler(){
public void handleMessage(Message msg) {
//干些什么呢
//bar_1.setProgress(msg.arg1);
//updateHandler.post(updateThread); // 执行了Runnable updateThread
};
};
//从updateHandler获得/关联msg 对象 但 没有执行 updateHandler
Message msg = updateHandler.obtainMessage();
msg.arg1 = i; //给msg 的 arg1 变量 赋值
//将msg 的值 压入 到 updateHandler 中, 并 执行 updateHandler 一次
updateHandler.sendMessage(msg);
try { // 等待 3000 毫秒
Thread.sleep(3000);
}catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
android.os.Process.killProcess(android.os.Process.myPid());
可以杀死 线程, 防止 即便通过 removeCallbacks 线程还在后台跑
或者 用 System.exit(0)
当然这样做的话 整个 程序 也 finish 掉了
有一点 handler 在在 主 线程中 执行 , 如果要新建线程 要使用 handlerThread 或者 new Thread
Thread t = new Thread(updateThread);
t.start();
作用 的话 替换掉 handler.post(updateThread); 就不用这个了。
------------------------------------------------------------------------------------------------------------------------------
HandlerThread: (循环从队列中处理消息的类,并新建线程)
其中 getLooper 返回一个关联的线程(handlerthread) 的循环 队列
其实 就是 先新建一个 handlerThread , 就是相当 新建了线程, 然后再 新建一个handler 使用 之前新建的handlerthread ,
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("Activity thread id = " + Thread.currentThread().getId());
//新建handlerthread 线程
HandlerThread newthread = new HandlerThread("handler_thread");
newthread.start();
//新建hander
Handler hander = new Handler(newthread.getLooper()){
@Override
//声明handlemessage
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//取得bundle
Bundle receiveBundle = msg.getData();
int age = receiveBundle.getInt("age");
String name = receiveBundle.getString("name");
System.out.println("Activity thread id = " + Thread.currentThread().getId());
System.out.println("Name = " + name + " , Age = " + age);
}
};
Message msg = hander.obtainMessage(); //关联Message
// 新建budnle 并赋值
Bundle bundle = new Bundle();
bundle.putInt("age", 20);
bundle.putString("name", "Jhon");
msg.setData(bundle);
msg.sendToTarget(); //传值给 handerMessage 并 启用 hander->handleMessage
}