2016-09-14 37 views
0

我有Android okhttp Websockets的線程問題。我正在做一個聊天應用程序,我需要使用websocket從我們的服務器讀寫。Android - NetworkOnMainThreadException與okhttp websocket

我在其他文章閱讀與Okhttp,我應該使用StrictMode.ThreadPolicy.Builder()。permitAll(),因爲它有一些問題等我添加它。

但我不斷收到這個錯誤,當我嘗試的sendMessage:

W/System.err的:android.os.NetworkOnMainThreadException 09-13 17:13:32.198 22766-22766/com.microsoft.translator

請注意,我在不同的線程上發送消息,而不是在主線程上。

這是我的代碼。感謝任何幫助。

創建的WebSocket:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my_chat); 

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    // lot other init stuff 
    createWebSocket(); 
} 

private void createWebSocket() { 
    okHttpClient = new OkHttpClient(); 
    Request request = new Request.Builder() 
      .url(WSS_URL + token) 
      .build(); 
    webSocketCall = WebSocketCall.create(okHttpClient, request); 
    webSocketCall.enqueue(this); 
} 

@Override 
public void onOpen(WebSocket webSocket, Response response) { 
    try { 
     Log.d(TAG, "onOpen: " + response.message()); 
     String message = createJsonMessage("Hello"); 
     byte[] messageBytes = message.getBytes(); 
     showToastOnUIThread("OnOpen sending message"); 

     webSocket.sendMessage(WebSocket.PayloadType.TEXT, new Buffer().write(messageBytes)); 
     this.webSocket = webSocket; 
     //startRepeatingTask(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

    private void sendMessage(final String msgString) { 

    Runnable postMessageThread = new Runnable() { 
     @Override 
     public void run() { 
      String message = createJsonMessage(msgString); 
      byte[] messageBytes = message.getBytes(); 

      try { 
       if (webSocket != null) { 
        try { 
         webSocket.sendMessage(WebSocket.PayloadType.TEXT, new Buffer().write(messageBytes)); 
        } catch (IOException e) { 
         e.printStackTrace(); 
         Toast.makeText(ChatActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
         Toast.makeText(ChatActivity.this, ex.getMessage(), Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    postMessageThread.run(); 
} 
+0

'我應該使用StrictMode.ThreadPolicy.Builder()。 permitAll()'。不,你最好不要那樣做。 – greenapps

回答

0

我覺得你的代碼應該是這樣的:

new Thread(new Runnable() { 
     public void run() { 
      // call send message here 
     } 
    }).start(); 

或者你可以使用Asyntask

+0

是不是我已經有了? Runnable postMessageThread = new Runnable(){ @Override public void run(){...}你是否想說使用Thread而不是Runnable類型的變量? – techtinkerer

+0

我覺得你用'Runnable'編碼在UI線程上運行,不會創建新線程,所以你會收到錯誤'NetworkOnMainThreadException'。所以新的線程將創建另一個線程。但我建議使用Asyntask來完成網絡請求。 –