主線程(UI線程)在啓動時在其入口函數main中就進行了 Looper.prepare ..... Looper.loop 操做。所以不須要手動進行。java
可是在非主線程中(通常是本身手動啓動的線程) 則須要顯示的調用Looper.prepare 和 Looper.loop . 而後才能夠在線程中啓用相應消息,調用Toast和Dialog或者經過handler相應消息, 緣由是Toast和Dialog中都有handler, 須要經過當前線程的looper和當前線程交互。網絡
loop是一個循環,其後的代碼不能執行,因此loop通常放在run方法的最後。而prepare在run方法最開始處。ide
另外,網絡請求必須放在非主線程中進行,不然報network in main thread exception。函數
Handler mHandler; Runnable runnable = new Runnable() { @Override public void run() { Looper.prepare(); ... // handler for other threads to send message mHandler = new Handler(){ public void handleMessage(Message msg) { // process incoming messages here } } //這裏的toast提示並不會立刻顯示,而是向run方法開頭準備的looper消息隊列發送消息 Toast.makeText(context "toast message" + res, Toast.LENGTH_SHORT).show(); ... Looper.loop(); //開始處理消息 } };