我有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();
}
'我應該使用StrictMode.ThreadPolicy.Builder()。 permitAll()'。不,你最好不要那樣做。 – greenapps