android里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。

一. Handler与Thread的区别。Handler与调用者处于同一线程,如果Handler里面做耗时的动作,调用者线程会阻塞。Android UI操作不是线程安全的,并且这些操作必须在UI线程中执行。Android提供了几种基本的可以在其他线程中处理UI操作的方案,包括Activity 的runOnUiThread(Runnable),View的post以及1.5版本的工具类AsyncTask等方案都采用了 Handler,Handler的post对线程的处理也不是真正start一个新的线程,而是直接调用了线程的run方法,这正是google煞费苦心 搞一套Handler的用意。

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

startThread();

// sendMessage();

SystemClock.sleep(2000);

setContentView(R.layout.main);

}

publicvoidstartThread() {

mThread.start();

}

publicvoidsendMessage() {

MHandler mHandler =newMHandler();

Message msg = mHandler.obtainMessage();

msg.sendToTarget();

}

classMHandlerextendsHandler {

publicMHandler() {

}

publicMHandler(Looper l) {

super(l);

}

@Override

publicvoidhandleMessage(Message msg) {

intcount = 0;

while(count++ < Integer.MAX_VALUE) {

Log.d(TAG, "Rintail");

}

}

}

Thread mThread =newThread() {

@Override

publicvoidrun() {

intcount = 0;

while(count++ < Integer.MAX_VALUE) {

Log.d(TAG, "Rintail");

}

}

};

二. Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的。但是如果用不同的Looper则能达到并发的目的。Service 中,onStart的执行也是阻塞的。如果一个startService在onStart执行完成之前,再次条用startService也会阻塞。如果 希望能尽快的执行onStart则可以在onStart中使用handler,因为Message的send是非阻塞的。如果要是不同消息的处理也是并发 的,则可以用不同的Looper实例化Handler。

publicvoidonStart(Intent intent,intstartId) {

super.onStart(intent, startId);

sendMessageWithLooper();

//sendMessage();

}

publicvoidsendMessage() {

MHandler mHandler =newMHandler();

Message msg = mHandler.obtainMessage();

msg.sendToTarget();

}

publicvoidsendMessageWithLooper() {

HandlerThread ht =newHandlerThread("Rintail");

ht.start();

MHandler mHandler =newMHandler(ht.getLooper());

Message msg = mHandler.obtainMessage();

msg.sendToTarget();

}

classMHandlerextendsHandler {

publicMHandler() {

}

publicMHandler(Looper l) {

super(l);

}

@Override

publicvoidhandleMessage(Message msg) {

Log.d(TAG, "first");

while(true) {

if(false)

break;

}

Log.d(TAG, "second");

}

};

classMyThreadextendsThread {

@Override

publicvoidrun() {

Log.d(TAG, "first");

while(true) {

if(false)

break;

}

Log.d(TAG, "second");

}

};

三。 资源回收

向Handler对象发送类似new Message ()形式的空Message可以达到清空Message的目的,这种做法与getLooper().quit()的做法是一样的。如果利用的资源较多,应及时清理。

更多相关文章

  1. Android事件总线之EventBus3.0基本使用
  2. 【整理一点资料】 Andorid的进程和线程模型
  3. xamarin android异步更新UI线程
  4. android handlerthread 通知机制
  5. Android消息机制
  6. Android中AsyncTask使用详解
  7. Android之Handler
  8. 一篇文章带你了解 Android(安卓)消息机制的原理!
  9. Android(安卓)Junit 单元测试、异步测试方法简介及异步测试框架

随机推荐

  1. Android下拉列表控件spinner-andoid学习
  2. Android(安卓)Dialog自定义宽高
  3. android 打开文件
  4. Android之Touch事件分发机制
  5. Android音乐播放器简单示例
  6. Android(安卓)计时器,定时功能
  7. android 图片LOMO效果
  8. Android(安卓)kotlin使用注解实现防按钮
  9. android项目源码异步加载远程图片的小例
  10. Android(安卓)Studio 使用NDK编译时常见