Ise*_*sen 6 java multithreading android android-handler
从一开始我就使用Handler的方法post()并postDelayed()在与UI线程不同的线程中做了一些事情,我决定在其上创建一个TCP Socket,但它不起作用.
我收到了NetworkOnMainThreadException被扔了.
是否有任何方法可以执行post()和postDelayed()不在UI线程中的任务?
public class ServerHandler extends Handler {
private Socket serverSocket;
public ServerHandler(){
super(new MyHandlerThread("MyHandlerThread").getLooper());
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
public void connectServer()
{
post(serverConnection);
}
public void writeMessage(String msg){
try {
serverSocket.getOutputStream().write(msg.getBytes());
Log.d("MyLog","Message sent!");
}
catch (IOException io){
Log.d("MyLog","SendMessage error");
}
}
private Runnable serverConnection = new Runnable() {
@Override
public void run() {
try {
serverSocket = new Socket("152.168.21.24", 5001);
Log.d("MyLog","Server connected!");
while(true){
Log.d("MyLog","Listening server");
byte[] buffer = new byte[256];
int bytesReceived = serverSocket.getInputStream().read(buffer);
if(bytesReceived==-1) {
throw new IOException("Server disconnected");
}
else {
String msg = new String(buffer,0,bytesReceived);
Log.d("MyLog","Message received: " + msg);
}
}
}
catch (IOException io){
Log.d("MyLog","Server connection error " + io.getMessage());
connectServer();
}
}
};
Run Code Online (Sandbox Code Playgroud)
}
Handler#post()在Looper线程上发布消息和Runnables .a的默认构造函数Handler将自身绑定到创建它的Looper线程.如果它不在Looper线程上,那么它将抛出异常.因此,要在工作线程上使用Handler,必须首先创建一个线程并使用Looper循环它.然后将给定的构造函数传递给Looper它Handler.
幸运的是,已经有一个实用程序类可以为您完成大部分工作.它叫做HandlerThread.只需创建一个HandlerThread,并getLooper在需要线程的Looper时调用.
编辑:默认处理程序构造函数不选择主线程.如果它已经是Looper线程,它会选择当前线程.