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"); } } }