`
rayloo
  • 浏览: 84741 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

android Handler

阅读更多

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;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics