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 }