Android 不是';t HANDLER有自己的线程吗?

Android 不是';t HANDLER有自己的线程吗?,android,multithreading,Android,Multithreading,我现在真的很沮丧 我正在尝试进行套接字连接,但总是出现NetworkOnMainThread异常 我的目标是创建一个具有线程、套接字和Messenger模型的对象,以便专门使用该对象进行通信,如下所示: WebBridge wb = new WebBridge(); wb.Send("My data to send", myLocalMessengerForAnswer); 我尝试使用具有相同结果的处理程序。我也尝试过,用自己的处理程序创建自己的线程,但没有成功 处理程序不应该有自己的线程吗

我现在真的很沮丧

我正在尝试进行套接字连接,但总是出现NetworkOnMainThread异常

我的目标是创建一个具有线程、套接字和Messenger模型的对象,以便专门使用该对象进行通信,如下所示:

WebBridge wb = new WebBridge(); 
wb.Send("My data to send", myLocalMessengerForAnswer);
我尝试使用具有相同结果的处理程序。我也尝试过,用自己的处理程序创建自己的线程,但没有成功

处理程序不应该有自己的线程吗?如果我应该在处理程序的线程中,为什么会出现NetworkInMainThread异常

提前谢谢

public class WebBridge {
    private class WebBridgeThread extends Thread {
    static final int STARTUP = 1;

    public Handler handler;
    Socket socket;

    public WebBridgeThread() {
        super("WebBridgeThread");
    }

    @Override
    public void run() {
        Looper.prepare();
        handler = new Handler() {
            @Override
            public void dispatchMessage(Message msg) {
                // TODO Auto-generated method stub
                super.dispatchMessage(msg);
                switch(msg.what) {
                    case STARTUP:
                    try {
                        socket = new Socket("192.168.100.99",1234);
                        int fer = 5;
                    } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                }
            }
        };
        Looper.loop();
    }


}


public WebBridge(Context paramContext) {
    WebBridgeThread wbt = new WebBridgeThread();
    wbt.start();
    Message msg = new Message();
    msg.what = WebBridgeThread.STARTUP;
    wbt.handler.dispatchMessage(msg);
}
如果我应该在处理程序的线程中,为什么会出现NetworkInMainThread异常

如果您检查
处理程序的代码
,您将看到
dispatchMessage()
基本上调用
handleMessage()
,这意味着它在当前线程上运行,即在您的情况下的UI线程

相反,如果您调用
sendMessage()
,处理程序将使消息排队,并在带有循环器的线程上运行
handleMessage()
中的逻辑,即您案例中的后台线程。(在引擎盖下
Looper.loop()
在从队列中退出消息队列后直接调用
dispatchMessage()
;此处当前线程是带有Looper的线程)

所以您需要

  • WebBridge()
    中使用
    sendMessage()
    而不是
    dispatchMessage()
  • 处理程序中重写
    handleMessage()
    而不是
    dispatchMessage()
  • 将线程优先级设置为background也是一个好主意,这样您就不会与UI线程竞争太多


    顺便说一句,你也可以使用一个
    HandlerThread
    ,它为你做了艰苦的工作,它创建了一个新的线程并设置了它的优先级。然后,在启动它之后,您可以获取它的循环器(
    getLooper()
    ),并将其推入处理程序的构造函数中。您仍然需要在处理程序中覆盖网络逻辑的
    handleMessage()

    dispatchMessage vs sendMessage…根据android文档,必须添加以下内容:“每个处理程序实例都与单个线程和该线程的消息队列相关联。创建新处理程序时,它将绑定到创建它的线程的线程/消息队列。我想我没听清楚那部分!