new Thread(new Runnable)).start() causes NetworkOnMainThread



我用谷歌搜索了它和StackoverFlow,但我可以使用的信息不多。

并且大多数答案建议使用线程,不要在主线程中打开套接字。

无论如何,我的代码是这样的

public class Client implements Runnable {
private Socket socket;
private static ObjectOutputStream oos;
public Client() {
    mPauseLock = new Object();
    mPaused = false;
    mFinished = false;
    try {
        socket = new Socket("168.131.148.50", 5001);
        pw = new PrintWriter(socket.getOutputStream(), true);
        oos = new ObjectOutputStream(socket.getOutputStream());
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public void run() {
        for (int i = 0; i < MsgQueue.getSize(); i++) {
            try {
                oos.writeObject(MsgQueue.get(i));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}
}

在主活动中 new Thread(new Client()).start();

但我仍然得到NetworkOnMainThreadExcpetion

任何人都可以告诉我解决方案吗?

尝试将构造函数中的初始化代码移动到 run() 中的 for 循环之前

调用"new Client()"行时,你在主线程中做套接字调用,你应该把所有与套接字创建相关的代码都移到 run 方法里面,你必须知道后台线程中只执行 "run" 方法,而不是类初始化:

public class Client implements Runnable {
private Socket socket;
private static ObjectOutputStream oos;
public Client() {
    mPauseLock = new Object();
    mPaused = false;
    mFinished = false;
}
public void run() {
    try {
        socket = new Socket("168.131.148.50", 5001);
        pw = new PrintWriter(socket.getOutputStream(), true);
        oos = new ObjectOutputStream(socket.getOutputStream());
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    for (int i = 0; i < MsgQueue.getSize(); i++) {
        try {
            oos.writeObject(MsgQueue.get(i));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

在进入Android之前,你应该阅读更多关于java的信息。

问候!

最新更新