How to run service not on main thread? How to run service not on main thread? multithreading multithreading

How to run service not on main thread?


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.

public class MyIntentService extends IntentService {    public MyIntentService() {        super("MyIntentService");    }    @Override    protected void onHandleIntent(Intent intent) {        // this method is called in background thread    }    @Override    public IBinder onBind(Intent intent) {        return null;    }    }

In your activity you start the service as following.

startService(new Intent(this, MyIntentService.class));

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.

public class MyAsyncService extends Service {    private AtomicBoolean working = new AtomicBoolean(true)    private Runnable runnable = new Runnable() {        @Override        public void run() {            while(working.get()) {                // put your socket-code here                ...            }        }    }    @Override    public void onCreate() {        // start new thread and you your work there        new Thread(runnable).start();        // prepare a notification for user and start service foreground        Notification notification = ...        // this will ensure your service won't be killed by Android        startForeground(R.id.notification, notification);    }    @Override    public onDestroy() {        working.set(false)    }}


Move this code to your thread:

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();}

Just as an example (I'm not sure it this fits to your task):

Thread t = new Thread(){        public void run(){            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();            }            mIntent= new Intent(MainActivity.this, ConnectonService.class);            mIntent.putExtra("KEY1", "Value used by the service");            context.startService(mIntent);        }    };t.start();

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.