public class SocketThread {
private boolean connect = false;
private String ip = "*********";
private int port = ****;
private Socket socket;
private SocketAsync socketAsync;
public SocketThread() {
socketAsync = new SocketAsync();
socketAsync.execute();
}
public void setMessenger(SocketServiceMessenger messenger) {
this.socketServiceMessenger = messenger;
}
public void setConnectFlag(boolean connect) {
this.connect = connect;
}
public void sentData(JSONObject json) {
socketAsync.sentData2(json);
}
private class SocketAsync extends AsyncTask<Void, Void, String> {
private PrintWriter printWriter;
@Override
protected String doInBackground(Void... params) {
String msgStr;
String type;
try {
socket = new Socket(InetAddress.getByName(ip),port);
OutputStreamWriter streamOut = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
printWriter = new PrintWriter(streamOut);
streamOut.flush();
BufferedReader streamIn = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
while(socket.isConnected()) {
msgStr = streamIn.readLine();
System.out.println(msgStr);
if(!connect) {
socket.close();
}
}
System.out.println("SocketDisconnected");
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
public void sentData2(JSONObject json) {
if(socket.isConnected()) {
printWriter.println(json.toString());
printWriter.flush();
System.out.println("OUT : " + json);
}
}
}
我得到android.os.NetworkOnMainThreadException調用sentData()NetworkOnMainThreadException中的AsyncTask【解析】
現在我用
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
來解決問題,但我想知道如何當以真實的方式使用asynctask。
此代碼適用於實時接收服務器消息的在線遊戲,也可以通過調用sentData()從某個活動向服務器發送消息。
解決
Example: Android bi-directional network socket using AsyncTask
請發佈堆棧跟蹤。 – CommonsWare
它只是說「android.os.NetworkOnMainThreadException」 – Tanggyxyz
請發佈**整個堆棧跟蹤**。你所顯示的只是例外描述。您需要查看代碼的哪些行觸發了此完全堆棧跟蹤中包含的異常。 – CommonsWare