android.os.NetworkOnMainThreadException doinbackground方法

时间:2016-04-17 12:11:01

标签: android android-asynctask

我想在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;
}

1 个答案:

答案 0 :(得分:1)

您的方法AsyncTask似乎是从doInBackground()外部调用的。在这种情况下,它将在主/ UI线程上执行。您必须在doInBackground内处理所有网络访问代码(或至少从Client调用它)。

考虑这些事情的最简单方法是认识到doInBackground() 本身就是一个单独的线程 - 实际上isIn()就是& #34;螺纹&#34;这里。所有其他方法(例如Client)只是常规方法,它们在doInBackground()内定义是无关紧要的,如果你不从它们调用它们,它们仍将在主线程上执行{{1}}。