d、自己创建新的线程,然后在新线程中创建Looper,主线程调用子线程中的发消息方法,将消息发给子线程的消息队列。

package com.dxyh.test;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;public class MainActivity extends Activity {private final static String TAG = "HandlerTest";private final static int TASK_BEGIN= 1;private final static int TASK_1= 2;private final static int TASK_2= 3;private final static int TASK_END= 4;private Handler workHandler = null;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +        "This is in main thread.");                LooperThread testThread = new LooperThread();        testThread.start();                // 注意,这里需要等待一下,防止出现空指针异常        while (null == workHandler) {        }                testThread.sendMessageTodoYourWork();    }        class LooperThread extends Thread {    @Override    public void run() {    Looper.prepare();        workHandler = new Handler() {    // 现在在每个case之后,你可以做任何耗时的操作了        @Override        public void handleMessage(Message msg) {        switch (msg.what) {        case TASK_BEGIN:        Log.i(TAG, "[H_TID:" +           Thread.currentThread().getId() + "] Get TASK_BEGIN");        break;                case TASK_1:        Log.i(TAG, "[H_TID:" +           Thread.currentThread().getId() + "] Get TASK_1");        break;                case TASK_2:        Log.i(TAG, "[H_TID:" +           Thread.currentThread().getId() + "] Get TASK_2");        break;                case TASK_END:        Log.i(TAG, "[H_TID:" +           Thread.currentThread().getId() + "] Get TASK_END");        Looper.myLooper().quit();        finish();        break;        }        super.handleMessage(msg);        }    };        Looper.loop();    }        public void sendMessageTodoYourWork() {    Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_START to handler.");    // 启动任务(消息只有标识,立即投递)    workHandler.sendEmptyMessage(TASK_BEGIN);    Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_1 to handler.");    // 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)    Message msg1 = workHandler.obtainMessage(TASK_1);    msg1.obj = "This is task1";    workHandler.sendMessage(msg1);        Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_2 to handler.");        // 开启任务2(和上面类似)    Message msg2 = Message.obtain();    msg2.arg1 = 10;    msg2.arg2 = 20;    msg2.what = TASK_2;    workHandler.sendMessage(msg2);    Log.i(TAG, "[S_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_END to handler.");    // 结束任务(空消息体,延时2s投递)    workHandler.sendEmptyMessageDelayed(TASK_END, 2000);    }    }}

运行结果:

e、主/子线程均有一个消息队列,然后相互传递消息(这种方式是最灵活的,双向传递,也不复杂)

package com.dxyh.test;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;public class MainActivity extends Activity {private final static String TAG = "HandlerTest";private final static int TASK_BEGIN= 1;private final static int TASK_1= 2;private final static int TASK_2= 3;private final static int TASK_END= 4;private final static int TASK_BEGIN_OVER= 11;private final static int TASK_1_OVER= 12;private final static int TASK_2_OVER= 13;private final static int TASK_END_OVER= 14;private Handler workHandler = null;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Log.i(TAG, "[M_TID:" + Thread.currentThread().getId() + "]" +        "This is in main thread.");                LooperThread testThread = new LooperThread();        testThread.start();                // 注意,这里需要等待一下,防止出现空指针异常        while (null == workHandler) {        }                testThread.sendMessageTodoYourWork();    }      Handler mainHandler = new Handler () {    // 在每个case之后,不能做耗时的操作    @Override    public void handleMessage(Message msg) {    switch (msg.what) {    case TASK_BEGIN_OVER:    Log.i(TAG, "[MH_TID:" +    Thread.currentThread().getId() + "] TASK_BEGIN_OVER");    break;        case TASK_1_OVER:    Log.i(TAG, "[MH_TID:" +    Thread.currentThread().getId() + "] TASK_1_OVER");    break;        case TASK_2_OVER:    Log.i(TAG, "[MH_TID:" +    Thread.currentThread().getId() + "] TASK_2_OVER");    break;        case TASK_END_OVER:    Log.i(TAG, "[MH_TID:" +    Thread.currentThread().getId() + "] TASK_END_OVER");    finish();    break;    }    super.handleMessage(msg);    }    };        class LooperThread extends Thread {    @Override    public void run() {    Looper.prepare();        workHandler = new Handler() {    // 现在在每个case之后,你可以做任何耗时的操作了        @Override        public void handleMessage(Message msg) {        switch (msg.what) {        case TASK_BEGIN:        Log.i(TAG, "[ZH_TID:" +           Thread.currentThread().getId() + "] Get TASK_BEGIN");        // 做完之后报告信息给主线程        mainHandler.sendEmptyMessage(TASK_BEGIN_OVER);        break;                case TASK_1:        Log.i(TAG, "[ZH_TID:" +           Thread.currentThread().getId() + "] Get TASK_1");        // 做完之后报告信息给主线程        mainHandler.sendEmptyMessage(TASK_1_OVER);        break;                case TASK_2:        Log.i(TAG, "[ZH_TID:" +           Thread.currentThread().getId() + "] Get TASK_2");        // 做完之后报告信息给主线程        mainHandler.sendEmptyMessage(TASK_2_OVER);        break;                case TASK_END:        Log.i(TAG, "[ZH_TID:" +           Thread.currentThread().getId() + "] Get TASK_END");        Looper.myLooper().quit();        // 做完之后报告信息给主线程        mainHandler.sendEmptyMessage(TASK_END_OVER);        Looper.myLooper().quit();        break;        }        super.handleMessage(msg);        }    };        Looper.loop();    }        public void sendMessageTodoYourWork() {    Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_START to handler.");    // 启动任务(消息只有标识,立即投递)    workHandler.sendEmptyMessage(TASK_BEGIN);    Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_1 to handler.");    // 开始任务1(在workHandler的消息队列中获取一个Message对象,避免重复构造)    Message msg1 = workHandler.obtainMessage(TASK_1);    msg1.obj = "This is task1";    workHandler.sendMessage(msg1);        Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_2 to handler.");        // 开启任务2(和上面类似)    Message msg2 = Message.obtain();    msg2.arg1 = 10;    msg2.arg2 = 20;    msg2.what = TASK_2;    workHandler.sendMessage(msg2);    Log.i(TAG, "[ZS_ID:" + Thread.currentThread().getId() + "]" +"Send TASK_END to handler.");    // 结束任务(空消息体,延时2s投递)    workHandler.sendEmptyMessageDelayed(TASK_END, 2000);    }    }}

以上一到四均摘自:http://blog.csdn.net/dengxiayehu

更多相关文章

  1. android 关于Only the original thread that created a view hie
  2. android中获取到当前线程
  3. android线程相关1
  4. Android(安卓)SurfaceView
  5. 按powerkey唤醒启动上层Andord
  6. Android使用LocalSocket抓取数据
  7. Android系列之Message机制的灵活应用
  8. android捕获全局异常处理,不闪退
  9. 注意:Android中Handler引起的内存泄露

随机推荐

  1. PHP:MySQL常用DDL数据定义语言, DML数据
  2. 210429 PHP 回调函数 递归函数 数组函数
  3. 触屏事件-上下左右滑动
  4. Kubernetes结合Docker的优势
  5. 一个 当前点击元素放大的效果
  6. Kubernetes Containerd集成进入GA阶段
  7. git基本使用命令
  8. git 的入门使用到团队协作
  9. 关于背景图片的处理
  10. eslint 的基本配置介绍