handler 开启新线程 处理消息机制 默认情况下 使用handler.post(Thread对象)将线程对象加入到线程队列时 thread对象运行是和当前activity在同一个线程中执行操作的 而android大部分功能操作比较耗时 甚至可能会操作失败 的线程不可以和主线程一起完成 这就要求我们开启新的线程 需要用到looper对象 Looper类是android框架所提供的 可循环执行操作 如果我们的线程使用了looper 它便可以从消息队列中循环取出消息进行处理 当线程中无可用消息时 线程会进入休眠状态 looper对象通常不用我们自己创建 handlerThread类实现了循环处理消息的功能 用于getLooper()获取 public handlerActivity extends Activity{ @Override protected void onCreate(Bundle saveInstanceState) { super.onCrate(saveInstanceState); setContentView(R.layout.main); //打印当前线程的Id System.out.print("Activity-->"+Thread.currentThread.getId()); //声明 一个handlerThread对象 该类实现了Looper循环处理消息队列的功能 这个类由android系统应用框架提供 用于获取后期需要的处理当前消息队列的 looper对象 HandlerThread hanler=new HandlerThread(“handler_thread”); // 在使用HandlerThread的getLooper()方法之前 必须先调用该类的start() 否则looper为空 hanler.start(); //创建一个带有当前对象looper机制的handler MyHandler myHandler=new MyHandler(handler.getLooper()); //获得当前消息队列 Message msg=myHandler.obtainMessage(); // 利用msg存储数据 如果是少量数据 可以用arg1 arg2属性存储整型数据 可以使android内存消耗最低 也可使用obj属性存储 在handMessage()中取出 msg.arg1=int值 msg.obj=String值 //而如果是大量数据时 我们要使用到Bundle对象 它是一个特殊的Map类 //声明一个Bundle对象 Bundle b=new Bundle(); //向Bundle放入数据 b.putInt("age",39); b.putString("name",john); //将Bundle对象放入消息中 msg.setData(b); //向当前(即生成该msg消息对象)handler对象的消息队列发送消息 并会调用handler对象的handMessage方法 处理消息 msg.setdToTarget(); } } /** *创建一个MyHandler类 并声明两个构造函数 其中一个将looper对象作为参数 目的是当前handler可以使用looper所在的线程机制处理消息队列 *可以说是将handler对象绑定到另外一个具有looper处理机制的线程来异步处理数据 */ class MyHandler extends Handler{ //无参构造函数声明 public MyHandler(){ } //带有looper对象的有参构造函数声明 public MyHandler (Looper looper) { super(looper); } @Override //每当我们向handler发送msg对象时 都会执行此方法 取出消息对象进行处理 public void handlerMessage(Message msg) { String s=(String)ms.obj; //取出数据 Bundle b=msg.getDdata(); int age=b.getInt("age"); Sting name=b.getString("name"); //打印处理消息线程的Id System.out.print("MessageThread----->"+Thread.currentThread().getId()); } } |
|
来自: 张跃的Java > 《Android参考》