Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198392
  • 博文数量: 102
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1015
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-05 16:45
文章存档

2014年(73)

2013年(29)

我的朋友

分类: Android平台

2013-12-17 08:13:34

01_15_Handler的使用(二)

Handler主要用于异步消息处理(提供一种处理时间比较长的机制)
1、Handler与线程的关系
2、Bundle的用法
3、在新线程当中处理消息的方法

1、Handler与线程的关系
12-16 23:57:11.179: I/System.out(387): activity--->1
12-16 23:57:11.179: I/System.out(387): activityname--->main
12-16 23:57:11.259: I/System.out(387): handler--->1
12-16 23:57:11.259: I/System.out(387): handlername--->main

先出现 打印消息,10秒后ADT中再显示Hello Wrold,HandlerTest!
因为代码是这样的
handler.post(r);  //r线程当中有休眠10秒中
setContentView(R.layout.main);

setContentView(R.layout.main);
handler.post(r);  //r线程当中有休眠10秒中
上面的结果都会是:(先出现 打印消息,10秒后ADT中显示Hello Wrold,HandlerTest!)

//第二种测试  java的标准来启动线程
Thread t= new Thread(r);
t.start();
结果如下:(ADT中显示Hello Wrold,HandlerTest!然后打印下面的内容)
12-17 00:05:31.688: I/System.out(489): activity--->1
12-17 00:05:31.688: I/System.out(489): activityname--->main
12-17 00:05:31.701: I/System.out(489): handler--->11
12-17 00:05:31.709: I/System.out(489): handlername--->Thread-11

从上面的结果表明:handler并没有另外启动一个新的线程,而是直接调用线程的run()
//HandlerTest2工程

点击(此处)折叠或打开

  1. //HandlerTest.java
  2. package mars.handler;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.SystemClock;

  7. public class HandlerTest extends Activity {
  8.     private Handler handler = new Handler();
  9.     public void onCreate(Bundle savedInstanceState) {
  10.         super.onCreate(savedInstanceState);
  11.     //第一种测试
  12.     //     sendMessage();
  13.     //    handler.post(r);
  14.         setContentView(R.layout.main);
  15.         
  16.         //第三种测试
  17.         //        handler.post(r);
  18.         
  19.         //第二种测试 java的标准来启动线程
  20.         Thread t= new Thread(r);
  21.         t.start();
  22.         
  23.     
  24.         //try {
  25.         //    Thread.sleep(5000);
  26.         //} catch (InterruptedException e) {
  27.         //    e.printStackTrace();
  28.         //}
  29.         //System.out.println("a--->" + System.currentTimeMillis());
  30.         //Thread t = new Thread(r) ;
  31.         //t.start();
  32.         System.out.println("activity--->" + Thread.currentThread().getId());
  33.         System.out.println("activityname--->" + Thread.currentThread().getName());
  34.     }
  35.     
  36.     Runnable r = new Runnable(){
  37.         @Override
  38.         public void run(){
  39.             System.out.println("handler--->" + Thread.currentThread().getId());
  40.             System.out.println("handlername--->" + Thread.currentThread().getName());
  41.             try {
  42.                 Thread.sleep(50000);
  43.                 System.out.println("r2---?" + System.currentTimeMillis());
  44.             } catch (InterruptedException e) {
  45.                 // TODO Auto-generated catch block
  46.                 e.printStackTrace();
  47.             }
  48.     }
  49.     /*Thread r = new Thread(){
  50.         @Override
  51.         public void start(){
  52.             System.out.println("start---------");
  53.             super.start();
  54.         }
  55.         @Override
  56.         public void run() {
  57.             System.out.println("r1--->" + System.currentTimeMillis());
  58.             // TODO Auto-generated method stub
  59.             System.out.println("handler--->" + Thread.currentThread().getId());
  60.             System.out.println("handlername--->" + Thread.currentThread().getName());
  61.             try {
  62.                 Thread.sleep(10000);
  63.                 System.out.println("r2---?" + System.currentTimeMillis());
  64.             } catch (InterruptedException e) {
  65.                 // TODO Auto-generated catch block
  66.                 e.printStackTrace();
  67.             }
  68.         }*/        
  69.     };
  70. }


2、Bundle的用法()
Bundle用于实现Hanler 数据的传送,当然也可在Activity间数据的传递(http://blog.sina.com.cn/s/blog_9c153bc60101a0aq.html)
在一个线程中定义Bundle发送对象
  1.  MyHandler myHandler = new MyHandler(handlerThread.getLooper());
  2.         Message msg = myHandler.obtainMessage();
  3.         //将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
  4.         Bundle b = new Bundle();
  5.         b.putInt("age", 20);
  6.         b.putString("name", "Jhon");
  7.         msg.setData(b);
  8.         //将msg发送到目标对象,所谓目标对象,就是生成该msg对象的 handler对象
  9.         msg.sendToTarget();//必须有这么一句
在MyHandle中实现handleMessage(Message msg),并定义接受Bundle对象
  1.         public void handleMessage(Message msg) {
  2.             Bundle b = msg.getData();
  3.             int age = b.getInt("age");
  4.             String name = b.getString("name");
  5.             System.out.println("age is " + age + ", name is" + name);
  6.             System.out.println("Handler--->" + Thread.currentThread().getId());
  7.             System.out.println("handlerMessage");


3、在新线程当中处理消息的方法
HandlerTest2工程

点击(此处)折叠或打开

  1. //HandlerTest2.java
  2. package mars.handler;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.HandlerThread;
  7. import android.os.Looper;
  8. import android.os.Message;

  9. public class HandlerTest2 extends Activity {

  10.     @Override
  11.     protected void onCreate(Bundle savedInstanceState) {
  12.         // TODO Auto-generated method stub
  13.         super.onCreate(savedInstanceState);
  14.         setContentView(R.layout.main);
  15.         //打印了当前线程的ID
  16.         System.out.println("Activity-->" + Thread.currentThread().getId());
  17.         //生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,
  18.         //这个类由Android应用程序框架提供
  19.         HandlerThread handlerThread = new HandlerThread("handler_thread");
  20.         //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
  21.         handlerThread.start();
  22.         MyHandler myHandler = new MyHandler(handlerThread.getLooper());
  23.         Message msg = myHandler.obtainMessage();
  24.         //将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
  25.         Bundle b = new Bundle();
  26.         b.putInt("age", 20);
  27.         b.putString("name", "Jhon");
  28.         msg.setData(b);
  29. /*hanler 数据的传送
  30. msg.arg1=;
  31. msg.arg2=;
  32. msg.obj=;
  33. msg.setData(bundle)
  34. Bundle用于实现Hanler 数据的传送,当然也可在Intent间数据的传递*/

  35.         //将msg发送到目标对象,所谓目标对象,就是生成该msg对象的 handler对象
  36.         msg.sendToTarget();//必须有这么一句
  37.     }
  38.     
  39.     class MyHandler extends Handler{
  40.         public MyHandler(){
  41.             
  42.         }
  43.         public MyHandler(Looper looper){
  44.             super(looper);
  45.         }
  46.         @Override
  47.         public void handleMessage(Message msg) {
  48.             Bundle b = msg.getData();
  49.             int age = b.getInt("age");
  50.             String name = b.getString("name");
  51.             System.out.println("age is " + age + ", name is" + name);
  52.             System.out.println("Handler--->" + Thread.currentThread().getId());
  53.            // System.out.println("handlerMessage");不能有这句,有的话,上面的几句就不会打印的
  54. super.handleMessage(msg);
  55.         }
  56.     }
  57. }
system.out.的结果:
12-17 08:09:47.745: I/System.out(576): Activity-->1
12-17 08:09:47.795: I/System.out(576): age is 20,name is Jhon
12-17 08:09:47.795: I/System.out(576): Handler--->10
12-17 08:09:47.795: I/System.out(576): handlerMessage
上面表明 是在两个不同的线程
新建的另一个线程的代码 ,其中MyHandler是Handler的子类,并实现了public void handleMessage(Message msg)的方法
  1.  HandlerThread handlerThread = new HandlerThread("handler_thread");
  2.         //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
  3.         handlerThread.start();
  4.         MyHandler myHandler = new MyHandler(handlerThread.getLooper());

这次知识点比较新一点其中:1、在新线程当中处理消息的方法(之前的在一个线程在实现handler的 ),2、Bundle的用法
还是多看,多理解,能多练习最好。
阅读(781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~