好记性不如烂笔杆-android学习笔记<七>Handle用法
18,//Handle用法
//创建一个Handler对象
1 //创建一个Handler对象 2 Handler handler = new Handler(); 3 //将要执行的操作写在线程对象的run方法当中 4 Runnable updaterThread = new Runnable(){ 5 6 @Override 7 public void run() { 8 // TODO Auto-generated method stub 9 System.out.println("UpdateThread"); 10 //在run方法内部,执行postDelayed或者post方法 11 handler.postDelayed(updaterThread, 3000); 12 } 13 }; 14 //调用Handler的post方法,将要执行的线程对象添加到队列当中 15 handler.post(updaterThread); 16 //结束线程 17 handler.removeCallbacks(updaterThread); 18 //把线程装载到队列中,handler没有重新启动新的线程,而是直接在原有线程上调用run函数,没有使用start方法 19 //实现线程,开启线程 20 Thread t = new Thread(r); 21 t.start(); 22 Runnable r = new Runnable(){ 23 24 @Override 25 public void run() { 26 System.out.println("handler--->" + Thread.currentThread().getId()); 27 System.out.println("handlername--->" + Thread.currentThread().getName()); 28 try{ 29 Thread.sleep(10000); 30 }catch(InterruptedException e){ 31 e.printStackTrace(); 32 } 33 } 34 };
在OnCreate方法中
1 //1,生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供 2 HandlerThread handlerThread = new HandlerThread("handler_thread"); 3 //2,在使用HandlerThread的getLooper方法之前,必须先调用该类的start方法 4 handlerThread.start(); 5 //声明一个MyHandler函数,接收Looper参数,来处理消息。把线程绑定在Looper对象上 6 MyHandler myHandler = new MyHandler(handlerThread.getLooper()); 7 //获取消息对象 8 Message msg = myHandler.obtainMessage(); 9 //将msg发送到目标对象,所谓的对象就是生成的msg对象的Handler对象 10 msg.sendToTarget(); 11 12 //如何在message之间使用Bundle传递数据,存入数据 13 Bundle b = new Bundle(); 14 b.putInt("age", 20); 15 b.putString("name", "Jhon"); 16 msg.setData(b);
//MyHandler函数,继承Handler
1 class MyHandler extends Handler{ 2 3 public MyHandler(Looper looper){ 4 super(looper); 5 } 6 @Override 7 public void handleMessage(Message msg) { 8 //String s = (String)msg.obj; 9 //取出Bundle对象,获得其中存的值 10 Bundle b = msg.getData(); 11 int age = b.getInt("age"); 12 String name = b.getString("name"); 13 System.out.println("age is " + age + ","+"name is " + name); 14 15 System.out.println("Handler---->" + Thread.currentThread().getId()); 16 System.out.println("handlerMessage"); 17 } 18 }
//Handler小结:(这个总结是盗用别人的,谢谢原作者!!)
<1>,Handler的处理过程运行在创建Handler的线程里
<2>,一个looper对应一个MessageQueue
<3>,一个线程对应一个looper
<4>,一个looper对应多个Handler
<5>,不确定当前线程时,更新UI时尽量调用post();方法