android-Handler-03-数据传送

Handler会关联一个单独的线程和消息队列。Handler默认关联主线程,虽然要提供Runnable参数 ,但默认是直接调用Runnable中的run()方法。也就是默认下会在主线程执行,如果在这里面的操作会有阻塞,界面也会卡住。如果要在其他线程执行,可以使用HandlerThread。
 
将 handler 与looper 绑定,新开一个线程
massage.arg1
massage.arg2 可以放整形 相对消耗较小
message.obj 可以存放object 类型的数据
 
传递大量数据 
可以用message.setData();
例子:
public class HandlerTest2 extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
           setContentView(R.layout. activity_main);
            //打印了当前线程的ID
           System. out.println( "Activity-->" + Thread.currentThread().getId());
            //生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
           HandlerThread handlerThread = new HandlerThread("handler_thread" );
            //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
           handlerThread.start();
           MyHandler myHandler = new MyHandler(handlerThread.getLooper());
           Message msg = myHandler.obtainMessage();
            //将msg 发送到目标对象,所谓的目标对象,就是生成该 msg对象的handler对象
           Bundle b = new Bundle();
           b.putInt( "age", 20);
           b.putString( "name", "Jhon");
           msg.setData(b);
           msg.sendToTarget();
     }
     
     class MyHandler extends Handler{
            public MyHandler(){
                
           }
            public MyHandler(Looper looper){
                 super(looper);
           }
            @Override
            public void handleMessage(Message msg) {
                Bundle b = msg.getData();
                 int age = b.getInt( "age");
                String name = b.getString( "name");
                System. out.println( "age is " + age + ", name is" + name);
                System. out.println( "Handler--->" + Thread.currentThread().getId());
                System. out.println( "handlerMessage");
           }
     }
}

 

posted @ 2013-12-06 12:24  可惜不是你  阅读(278)  评论(0编辑  收藏  举报