From the beginning I though Handler's methods post()
and postDelayed()
did things in a different thread from UI thread, and I decided to create a TCP Socket on it, but it's not working.
I'm receiving NetworkOnMainThreadException
was thrown.
Is there any ways to perform post()
and postDelayed()
tasks not in the UI thread?
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();
}
}
};
}