標籤:
http://www.cnblogs.com/plokmju/p/android_Handler.html
android不允許在主線程裡做耗時操作,如網路操作,以此來避免ANR
ANR(Application Not Responding)
http://baike.baidu.com/link?url=rLzKRNkjt79XITQKhRXp32alhsuKEt2FoHPw3vuB2UlEvyKOZwnEh4OYoPy4_fwO6zPPECXWre4ycip4mB0LOq
Activity應該在它的關鍵生命週期方法(如onCreate()和onResume())裡儘可能少的去做建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位元影像尺寸,應該在子線程裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。
預設情況下,在android中Activity的最長執行時間是5秒,BroadcastReceiver的最長執行時間則是10秒。
因此如果想進行上述的操作,應該開啟一個子線程。而在子線程中,android不允許進行UI操作。如果想在子線程中進行UI操作,就可以使用Handler開啟UI線程。
Handler,它直接繼承自Object,一個Handler允許發送和處理Message或者Runnable對象,並且會關聯到主線程的MessageQueue中。每個Handler具有一個單獨的線程,並且關聯到一個訊息佇列的線程,就是說一個Handler有一個固有的訊息佇列。當執行個體化一個Handler的時候,它就承載在一個線程和訊息佇列的線程,這個Handler可以把Message或Runnable壓入到訊息佇列,並且從訊息佇列中取出Message或Runnable,進而操作它們。
由上可知,Handler有兩種用法:
- Post:Post允許把一個Runnable對象入隊到訊息佇列中。它的方法有:post(Runnable)、postAtTime(Runnable,long)、postDelayed(Runnable,long)。
- sendMessage:sendMessage允許把一個包含訊息資料的Message對象壓入到訊息佇列中。它的方法有:sendEmptyMessage(int)、sendMessage(Message)、sendMessageAtTime(Message,long)、sendMessageDelayed(Message,long)。
具體用法可以看第一個連結的文章
http://blog.csdn.net/gh102/article/details/7191486
這邊對post的使用更加清晰一點
Post和message區別:
http://blog.csdn.net/u013168615/article/details/47024073
從源碼中可以看出,post是調用了sendMessageDelayed方法:
public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); }
而其中的getPostMessage則是把Runnable r 封裝成一個空Message然後返回
private static Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m;}
所以post和message沒有本質區別,只是用法不同而已
handler.post和handler.sendMessage本質上是沒有區別的,都是發送一個訊息到訊息佇列中,而且訊息佇列和handler都是依賴於同一個線程的。
Android-多線程Handler