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的用意。

java代碼:

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。

 

You May Also Like