I'm trying to launch service
and then open socket
to have connection with server.
On button click I create new Thread
and then start service.
Thread t = new Thread(){
public void run(){
mIntent= new Intent(MainActivity.this, ConnectonService.class);
mIntent.putExtra("KEY1", "Value used by the service");
context.startService(mIntent);
}
};
t.start();
Then on service
, I try to open socket
and have connection with server
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
Scanner scanner = new Scanner(socket.getInputStream());
message = scanner.nextLine();
} catch (IOException e) {
e.printStackTrace();
}
return Service.START_NOT_STICKY;
}
But when I call it, I have error
08-30 08:56:49.268: E/AndroidRuntime(3751): java.lang.RuntimeException: Unable to start service com.example.testofconnection.ConnectonService@40ef02a8 with Intent { cmp=com.example.testofconnection/.ConnectonService (has extras) }: android.os.NetworkOnMainThreadException*
I think problem is that service
is on main thread
, but I can't find how should I start service on new (independend) thread to keep connection alive
?
Move this code to your thread:
Just as an example (I'm not sure it this fits to your task):
You should know that a service is running on the UI thread, so you got this error. Check this nice site for more information about various threading approaches in Android.
You can use IntentService for this. Just launch it normally with an Intent from the main thread.
onHandleIntent()
method gets executed in background thread. Put your socket-code in there. Here is an example code.In your activity you start the service as following.
If you need a long-lasting service, you can create a normal service and start a thread there. Here is an example. Make sure you launch it as "foreground" service. This will allow service to run longer without been killed by Android.