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的用意。
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
startThread();
// sendMessage();
SystemClock.sleep (2000);
setContentView(R.layout.main );
}
public void startThread() {
mThread.start();
}
public void sendMessage() {
MHandler mHandler = new MHandler();
Message msg = mHandler.obtainMessage();
msg.sendToTarget();
}
class MHandler extends Handler {
public MHandler() {
}
public MHandler(Looper l) {
super (l);
}
@Override
public void handleMessage(Message msg) {
int count = 0;
while (count++ < Integer.MAX_VALUE ) {
Log.d (TAG , "Rintail");
}
}
}
Thread mThread = new Thread() {
@Override
public void run() {
int count = 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。
public void onStart(Intent intent, int startId) {
super .onStart(intent, startId);
sendMessageWithLooper();
//sendMessage();
}
public void sendMessage() {
MHandler mHandler = new MHandler();
Message msg = mHandler.obtainMessage();
msg.sendToTarget();
}
public void sendMessageWithLooper() {
HandlerThread ht = new HandlerThread("Rintail");
ht.start();
MHandler mHandler = new MHandler(ht.getLooper());
Message msg = mHandler.obtainMessage();
msg.sendToTarget();
}
class MHandler extends Handler {
public MHandler() {
}
public MHandler(Looper l) {
super (l);
}
@Override
public void handleMessage(Message msg) {
Log.d (TAG , "first");
while (true ) {
if (false )
break ;
}
Log.d (TAG , "second");
}
};
class MyThread extends Thread {
@Override
public void run() {
Log.d (TAG , "first");
while (true ) {
if (false )
break ;
}
Log.d (TAG , "second");
}
};
三. 资源回收
向Handler对象发送类似new Message ()形式的空Message可以达到清空Message的目的,这种做法与getLooper().quit()的做法是一样的。假如利用的资源较多,应及时清理。
分享到:
相关推荐
System.out.println("Handler-->"+Thread.currentThread().getName()); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if ...
这次项目用到的主要是Handler Thread Looper,希望对这三者关系还不是很清楚的人能通过我的项目读懂,当然我也不敢保证一定能
比较了handler加thread 和 AsyncTask 在处理消息的不同,详见博客 http://blog.csdn.net/renlei0109/article/details/39524463
测试Thread中使用Handler修改
Handler+thread 加载网络图片,是个学习android多线程好Demo
handler结合Thread异步加载网络图片,诠释怎么在android实现多线程加载网络图片。。。
前几天看到一道面试题:Thread、Handler和HandlerThread有什么区别?,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),...
简单的Demo,简单的网络获取图片,显示图片而已
通过异步加载的方式实现网上照片的加载,使用Thread+Handler+Message技术实现,理解其他方式通过Handler和主线程通讯的原理。
Android中的Handler很重要,但是很简单,学好Handler很重要~
android Handler Thread AsyncTask httpURLConnection学习的代码
Demo android组件Service与Toast 第二个版本
NULL 博文链接:https://null-point.iteye.com/blog/1443287
NULL 博文链接:https://wangwei121004-163-com.iteye.com/blog/1177709
WebView+Thread(内置Handler)实现应用内浏览器demo1
ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面
实现的应用为一加法器,在thread中时行计算,主线程通过handler传递参数给thread,theread处理完后再通过handler传回主线程。如果只是实现加法器,没有必要整个线程和handler,主要的目的在于数据在不同线程通过...
171227-03.在Java中使用Android的Thread和Handler机制.java
采用两种方式thread+handler和asynctask方式来异步下载网络上的图片
简单实现更新UI的操作,仅供学习参考 这里用到handler类,runnable类,按钮的点击事件