我想在android上编写Tcp Client类但我无法将其所有方法转换为doinbackground形式。所有代码都在doinbackground方法中工作,但是当我更改它时会给出NetworkOnMainThreadException。
public class Client extends AsyncTask<Void, Void, Void> {
String playername = null;
Socket clientSocket;
DataOutputStream outToServer;
BufferedReader inFromServer;
public Client() {}
@Override
protected Void doInBackground(Void... params) {
try {
clientSocket = new Socket("192.168.1.7", 9999);
outToServer = new DataOutputStream(clientSocket.getOutputStream());
inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
public boolean isIn(String name) {
try{
String sentence;
String modifiedSentence;
if(clientSocket.isConnected()) {
sentence = "|isnamein|" + name + "|";
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
String[] playername = parse(modifiedSentence);
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
} else {
System.out.println("Not connected");
}
} catch(Exception e) {
e.printStackTrace();
return false;
}
return false;
}
答案 0 :(得分:1)
您的方法AsyncTask
似乎是从doInBackground()
外部调用的。在这种情况下,它将在主/ UI线程上执行。您必须在doInBackground
内处理所有网络访问代码(或至少从Client
调用它)。
考虑这些事情的最简单方法是认识到doInBackground()
不本身就是一个单独的线程 - 实际上isIn()
就是& #34;螺纹&#34;这里。所有其他方法(例如Client
)只是常规方法,它们在doInBackground()
内定义是无关紧要的,如果你不从它们调用它们,它们仍将在主线程上执行{{1}}。