上文讲到:

Handler会向MessageQueue以两种方式发送消息:sendMessage 和post 。他们都会加在消息队列中

他们的区别是:

SendMessage

Handler对象使用Post发送的是一个runnable对象,加在自己的线程队列中进行处理。所以他们还是在一个线程中进行处理。


package com.example.handler02;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.Menu;import android.view.MenuItem;public class Handler02 extends Activity {private Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler02);handler.post(r); // 使用post发送消息System.out.println("Activity  --->"+Thread.currentThread().getId());System.out.println("Activity  --->"+Thread.currentThread().getName());}Runnable r = new Runnable(){@Overridepublic void run() {System.out.println("handler ---> "+Thread.currentThread().getId());System.out.println("handler name ---> "+Thread.currentThread().getName());try{Thread.sleep(10000);}catch (InterruptedException e){e.printStackTrace();}}};}//通过实验可发现,直接使用handler,将线程类(r)放入到线程队列中时,与Activity是同一个线程,并没有新的线程产生/* * 11-17 11:59:45.130: I/System.out(1555): Activity  --->111-17 11:59:45.134: I/System.out(1555): Activity  --->main11-17 11:59:45.162: I/System.out(1555): handler ---> 111-17 11:59:45.162: I/System.out(1555): handler name ---> main */


第二种方式:

使用HandlerThread建立一个新的线程对象,并放入到Message Queue中进行处理。

最后发送的是一个message对象,会被handler的handleMessage的函数进行处理,会在被发送到的线程中进行处理。

package com.example.handler03;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;import android.view.Menu;import android.view.MenuItem;public class Handler03 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler03);System.out.println(Thread.currentThread().getId());System.out.println(Thread.currentThread().getName());// 声明一个handler线程,这里HandlerThread 建立了一个新的线程HandlerThread handlerThread =new HandlerThread("handler_thread");handlerThread.start(); // 启动线程。// 将handler线程绑定到一个消息队列上。MyHandler myhandler = new MyHandler(handlerThread.getLooper());// 得到handleThread的线程管理器looperMessage msg=myhandler.obtainMessage();Bundle b= new Bundle();b.putInt("age", 123);b.putString("name", "zhangsan");msg.setData(b);msg.sendToTarget();  // 将msg发送到目标对象,所谓的目标对象就是生成该对象的handler对象(handlerThread)}// MyHandler是一个继承Handler的类,使用构造函数将Looper(Message Queue管理器)将最新的线程放入线程队列// 复写HandleMessage处理线程信息class MyHandler extends Handler{public MyHandler(){}public MyHandler(Looper looper)  // 需要重写构造函数,将Looper对象放入父类handler的构造函数中,即将hanlder绑定到looper对象的线程上,处理消息队列中的消息{                                 // looper是消息对象super(looper);}@Overridepublic void handleMessage(Message msg) {System.out.println(Thread.currentThread().getId());System.out.println(Thread.currentThread().getName());System.out.println("handlerMessage");Bundle b= msg.getData();int age = b.getInt("age");String name=b.getString("name");System.out.println(name+"");}}}/*11-17 13:17:41.710: I/System.out(3389): 111-17 13:17:41.714: I/System.out(3389): main11-17 13:17:41.742: I/System.out(3389): 14611-17 13:17:41.742: I/System.out(3389): handler_thread11-17 13:17:41.746: I/System.out(3389): handlerMessage11-17 13:17:41.750: I/System.out(3389): zhangsan *  *  *  * */


第三种方法:

使用Java中标准Thread方式:

package com.example.handler02;import android.app.Activity;import android.os.Bundle;public class Handler02_2 extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_handler02);Thread t = new Thread(thread);t.start();  // 必须启动线程之后程序才可在新线程中使用System.out.println("Activity  --->"+Thread.currentThread().getId());System.out.println("Activity  --->"+Thread.currentThread().getName());}Runnable thread =new Runnable(){@Overridepublic void run() {System.out.println("handler  ---> "+ Thread.currentThread().getId());System.out.println("handler  --->"+ Thread.currentThread().getName());try{Thread.sleep(10000);}catch(InterruptedException e){e.printStackTrace();}}};}/* 11-17 12:18:27.746: I/System.out(1914): Activity  --->111-17 12:18:27.746: I/System.out(1914): Activity  --->main11-17 12:18:27.762: I/System.out(1914): handler  ---> 10111-17 12:18:27.762: I/System.out(1914): handler  --->Thread-101  */// 通过实验结果可发现,使用Thread启动了一个新的线程,




更多相关文章

  1. Android(安卓)Handler, Looper浅析
  2. Android(安卓)基础-Activity的使用(二)
  3. android:Bitmap和Drawable相互转换方法
  4. Android异步下载网络图片(其三)
  5. Handler: 更新UI的方法
  6. Android(安卓)AsyncTask 源码解析
  7. android中google“定位查询”
  8. android的Binder通信机制java层浅谈
  9. Android(安卓)非UI线程使用View.post()方法一处潜在的内存泄漏

随机推荐

  1. Docker与微服务
  2. PHP 变量
  3. classList 和 事件
  4. 轮播图实例和xhr对象的使用
  5. Layui图片预览
  6. yum安装 一直出现There are no enabled r
  7. Layui关闭父级弹窗
  8. android自定义属性之format介绍
  9. 对Android(安卓)NDK的理解【Android】
  10. Android中使用XmlSerializer拼装XML数据