android的定时及消息队列处理
2013-09-05 12:06
218 查看
最近在做项目的时候,发觉有很多需要工作线程及消息处理的地方,而android自身提供了很好的包装类,这里对自己使用的一些梳理,权作自己的笔记。
主要有几种实现方式:
1.使用Handler.postAtTime定时将Runnable作为工作线程,处理耗时工作;
2.通过使用HandlerThread;
3.自定义Thread,并实现消息循环。
代码1:Runnable片段
代码2:HandlerThread
代码3:Thread进行消息处理
注意退出时发送mExportHandler.sendEmptyMessage(_QUIT);
因为项目中需要分步骤进行处理,在一个步骤上失败后需要进行间隔尝试
next > 15时作退出处理,15只是一个步骤定义,可以指定更多或更少。
代码1、2的完整代码
主要有几种实现方式:
1.使用Handler.postAtTime定时将Runnable作为工作线程,处理耗时工作;
2.通过使用HandlerThread;
3.自定义Thread,并实现消息循环。
代码1:Runnable片段
private Handler mTickerHandler = new Handler(); private Runnable mTicker = new Runnable() { public void run() { if (mTickerStop) { return; } if (!mTickerSkip) { // TODO 执行实际的工作 } long time = SystemClock.uptimeMillis(); long step = time - time % 1000L + 1000L * STEP; // time - time % 1000L此处的减去求余操作,是为了将定时设置在整数秒上 mTickerHandler.postAtTime(MainActivity.this.mTicker, step); } };
代码2:HandlerThread
private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { int what = msg.what; trace("Thread:" + Thread.currentThread() + ", msg:" + msg); // 执行任务操作 } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 此处定义了两个工作线程,并将工作线程并设置响应的消息处理的handler HandlerThread senderThread = new HandlerThread("[sender_service]"); senderThread.start(); mSenderServiceLooper = senderThread.getLooper(); mSenderServiceHandler = new ServiceHandler(mSenderServiceLooper); HandlerThread receiverThread = new HandlerThread("[receiver_service]"); receiverThread.start(); mReceiverServiceLooper = receiverThread.getLooper(); mReceiverServiceHandler = new ServiceHandler(mReceiverServiceLooper); // 开启定时处理 startTicker(); } @Override protected void onDestroy() { super.onDestroy(); stopTicker(false); // 销毁时要调用quit方法,将工作线程的消息循环停止 mSenderServiceLooper.quit(); mReceiverServiceLooper.quit(); }
代码3:Thread进行消息处理
public Handler mExportHandler; private static final int _QUIT = -1; private static final int _STEP = 0; private static final int _START = 1; private static final int _END = 2; private static final int _FAIL = 3;
new Thread() { private int preNext = 0; public void run() { Looper.prepare(); mExportHandler = new Handler() { public void handleMessage(Message msg) { System.out.println("msg=" + msg); switch (msg.what) { case _QUIT: Looper.myLooper().quit(); break; case _STEP: int next = exports(isSender, msg.arg1); if (next > 15) { mExportHandler.sendEmptyMessage(_QUIT); return; } if (preNext == next) { mExportHandler.sendMessageDelayed( mExportHandler.obtainMessage(_STEP, next, 0), 5000L); } else { preNext = next; mExportHandler.sendMessage(mExportHandler .obtainMessage(_STEP, next, 0)); } break; case _START: break; case _END: case _FAIL: mReporter.report( ProcessReport.STATE_BACKUP_CONTACTS, msg.arg1, msg.arg2, msg.obj); break; } } }; mExportHandler.sendMessage(mExportHandler.obtainMessage(_STEP, 0, 0)); Looper.loop(); } }.start();
注意退出时发送mExportHandler.sendEmptyMessage(_QUIT);
因为项目中需要分步骤进行处理,在一个步骤上失败后需要进行间隔尝试
next > 15时作退出处理,15只是一个步骤定义,可以指定更多或更少。
private int exports(boolean isSender, int step) { int next = step; try { if (next == 0) { // 步骤一 if (!excutore(...)) { // 失败时next保持不变,直接放回,定时间隔后再次执行 return next; } // 执行成功后,进行下一步操作 next++; } if (next == 1) { // 步骤二 if (!excutore(...)) { // 失败时next保持不变,直接放回,定时间隔后再次执行 return next; } } // 其他步骤依此 ... // > 15则退出循环 next = 16; } catch (Exception e) { AdbDebug.LogException(e); } return next; }
代码1、2的完整代码
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.os.SystemClock; public class MainActivity extends Activity { private static final boolean DEBUG = false; private static final long STEP = 15L; private boolean mTickerStop = true; private boolean mTickerSkip; private volatile Looper mSenderServiceLooper; private volatile Looper mReceiverServiceLooper; private volatile ServiceHandler mSenderServiceHandler; private volatile ServiceHandler mReceiverServiceHandler; private Handler mTickerHandler = new Handler(); private Runnable mTicker = new Runnable() { public void run() { if (mTickerStop) { return; } if (!mTickerSkip) { // TODO 执行实际的工作 } long time = SystemClock.uptimeMillis(); long step = time - time % 1000L + 1000L * STEP; // time - time % 1000L此处的减去求余操作,是为了将定时设置在整数秒上 mTickerHandler.postAtTime(MainActivity.this.mTicker, step); } }; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { int what = msg.what; trace("Thread:" + Thread.currentThread() + ", msg:" + msg); // 执行任务操作 } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 此处定义了两个工作线程,并将工作线程并设置响应的消息处理的handler HandlerThread senderThread = new HandlerThread("[sender_service]"); senderThread.start(); mSenderServiceLooper = senderThread.getLooper(); mSenderServiceHandler = new ServiceHandler(mSenderServiceLooper); HandlerThread receiverThread = new HandlerThread("[receiver_service]"); receiverThread.start(); mReceiverServiceLooper = receiverThread.getLooper(); mReceiverServiceHandler = new ServiceHandler(mReceiverServiceLooper); // 开启定时处理 startTicker(); } @Override protected void onDestroy() { super.onDestroy(); stopTicker(false); // 销毁时要调用quit方法,将工作线程的消息循环停止 mSenderServiceLooper.quit(); mReceiverServiceLooper.quit(); } private void startTicker() { mTickerSkip = false; if (mTickerStop) { mTickerStop = false; mTicker.run(); } } private void stopTicker(boolean isStop) { if (isStop && !mTickerStop) { // 当前没有停止时,则移除消息队列中的消息,并将mTickerStop赋值true mTickerHandler.removeCallbacks(mTicker); mTickerStop = true; } mTickerSkip = true; } }
相关文章推荐
- 《Android系统学习》第十章:Android消息处理、消息循环和消息队列
- 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
- Android之使用looper处理消息队列
- Android消息队列(二)--异步消息处理
- Android消息处理机制(二):循环和消息队列的创建
- Android消息队列(三)--多线程与消息处理
- Android消息队列处理消息
- Android 系列 4.11使用活动线程队列和处理程序在线程之间发送消息
- 关于android Handler进行线程处理消息队列与线程队列线程无法停止的问题
- android开发教程之使用looper处理消息队列
- 当主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息
- Android Handler消息处理机制详解
- Android 按键消息处理
- Android 触摸消息处理
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
- 深入理解Android消息处理系统——Looper、Handler、Thread
- Android应用程序消息处理机制(Looper、Handler)分析