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;

}

更多相关文章

  1. [置顶] Android之高仿手机QQ聊天
  2. 每天学习一个Android中的常用框架——12.Handler
  3. Android之View篇2————View的事件分发
  4. Android之高仿手机QQ聊天
  5. 【Android(安卓)周末回眸】2011.07.25-2011.07.31
  6. Android事件分发机制
  7. Android,谁动了我的内存(1)
  8. Android图像处理简介の使用内置Camera应用程序进行图像捕获
  9. Android多线程AsyncTask详解

随机推荐

  1. osmdroid的使用
  2. 浅谈android的selector背景选择器
  3. Android(安卓)Toast优化,不看别后悔
  4. 对Android进程优先级和Service的理解
  5. 解决TextView中MaxLines与ellipsize=end
  6. Android的多媒体数据库
  7. [Android]自定义View带效果的滚动数字
  8. Android应用安装错误:INSTALL_FAILED_MEDI
  9. Android应用程序资源——Drawable资源概
  10. Android(安卓)Building System 分析