Android 不是';t HANDLER有自己的线程吗?
我现在真的很沮丧 我正在尝试进行套接字连接,但总是出现NetworkOnMainThread异常 我的目标是创建一个具有线程、套接字和Messenger模型的对象,以便专门使用该对象进行通信,如下所示:Android 不是';t HANDLER有自己的线程吗?,android,multithreading,Android,Multithreading,我现在真的很沮丧 我正在尝试进行套接字连接,但总是出现NetworkOnMainThread异常 我的目标是创建一个具有线程、套接字和Messenger模型的对象,以便专门使用该对象进行通信,如下所示: WebBridge wb = new WebBridge(); wb.Send("My data to send", myLocalMessengerForAnswer); 我尝试使用具有相同结果的处理程序。我也尝试过,用自己的处理程序创建自己的线程,但没有成功 处理程序不应该有自己的线程吗
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()
顺便说一句,你也可以使用一个
HandlerThread
,它为你做了艰苦的工作,它创建了一个新的线程并设置了它的优先级。然后,在启动它之后,您可以获取它的循环器(getLooper()
),并将其推入处理程序的构造函数中。您仍然需要在处理程序中覆盖网络逻辑的handleMessage()
。dispatchMessage vs sendMessage…根据android文档,必须添加以下内容:“每个处理程序实例都与单个线程和该线程的消息队列相关联。创建新处理程序时,它将绑定到创建它的线程的线程/消息队列。我想我没听清楚那部分!