Android之Handler详解(四)
16lz
2021-01-24
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
更多相关文章
- android 关于Only the original thread that created a view hie
- android中获取到当前线程
- android线程相关1
- Android(安卓)SurfaceView
- 按powerkey唤醒启动上层Andord
- Android使用LocalSocket抓取数据
- Android系列之Message机制的灵活应用
- android捕获全局异常处理,不闪退
- 注意:Android中Handler引起的内存泄露