2015-12-13 37 views
2

現在我真的很沮喪。HANDLER是不是有一個自己的主題?

我想做一個套接字連接,但我總是得到NetworkOnMainThread異常。

我的目標是創建具有螺紋,插座和Messenger模型comunicate僅使用該對象,像這樣的對象:

WebBridge wb = new WebBridge(); 
wb.Send("My data to send", myLocalMessengerForAnswer); 

我試圖用一個處理器具有相同的結果。我也試過這個,用自己的Handler創建自己的線程,但沒有成功。

不是處理程序被拋棄有自己的線程嗎?如果我應該在處理程序的線程中,爲什麼會收到NetworkInMainThread異常?

在此先感謝。

public class WebBridge { 
    private class WebBridgeThread extends Thread { 
    static final int STARTUP = 1; 

    public Handler handler; 
    Socket socket; 

    public WebBridgeThread() { 
     super("WebBridgeThread"); 
    } 

    @Override 
    public void run() { 
     Looper.prepare(); 
     handler = new Handler() { 
      @Override 
      public void dispatchMessage(Message msg) { 
       // TODO Auto-generated method stub 
       super.dispatchMessage(msg); 
       switch(msg.what) { 
        case STARTUP: 
        try { 
         socket = new Socket("192.168.100.99",1234); 
         int fer = 5; 
        } catch (UnknownHostException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        break; 
       } 
      } 
     }; 
     Looper.loop(); 
    } 


} 


public WebBridge(Context paramContext) { 
    WebBridgeThread wbt = new WebBridgeThread(); 
    wbt.start(); 
    Message msg = new Message(); 
    msg.what = WebBridgeThread.STARTUP; 
    wbt.handler.dispatchMessage(msg); 
} 
+0

dispatchMessage vs sendMessage ... – Selvin

回答

3

爲什麼我得到NetworkInMainThread異常,如果我應該是在處理器的線程?

如果您檢查Handler的代碼,你會看到dispatchMessage()基本要求handleMessage(),這意味着運行當前線程上,即在你的情況下,UI線程。

相反,如果您調用sendMessage(),處理程序將排隊該消息並使用活套(即,背景線程)在該線程上運行handleMessage()中的邏輯。 (在從隊列中出隊的消息後Looper.loop()直接調用dispatchMessage()罩;這裏的當前線程是活套的線程)

所以,你需要

  1. 使用sendMessage()WebBridge()代替dispatchMessage()
  2. 覆蓋handleMessage(),而不是dispatchMessage()Handler

將線程優先級設置爲後臺也是一個好主意,因此您不會在UI線程中競爭太多。

順便說一句,你也可以使用HandlerThread這爲你辛苦工作,它創建一個新的線程,並設置其優先級。然後,在你啓動它之後,你可以得到它的活套(getLooper())並將其推入處理程序的構造函數中。您仍然需要在網絡邏輯的處理程序中覆蓋handleMessage()

+1

不得不根據android文檔添加這個:「每個Handler實例都與一個線程和該線程的消息隊列相關聯**當您創建一個新的Handler時,它綁定到線程/消息隊列_of正在創建它的線程_ **。 猜猜我沒有抓住那部分! – FjjF

相關問題