Where to stop/destroy threads in Android Service class?
- by niko
Hi,
I have created a threaded service the following way:
public class TCPClientService extends Service{
...
@Override
public void onCreate()
{
...
	Measurements = new LinkedList<String>();
	enableDataSending();
}
@Override
public IBinder onBind(Intent intent)
{
	//TODO: Replace with service binding implementation
	return null;
}
@Override
public void onLowMemory()
{
	Measurements.clear();
	super.onLowMemory();
};
@Override
public void onDestroy() 
{
	Measurements.clear();
	super.onDestroy();
	try
	{
		SendDataThread.stop();
	}
	catch(Exception e)
	{
	}
};
private Runnable backgrounSendData = new Runnable()
{
	public void run()
	{
		doSendData();
	}
};
private void enableDataSending()
{
	SendDataThread = new Thread(null, backgrounSendData, "send_data");
	SendDataThread.start();
}
private void addMeasurementToQueue()
{
	if(Measurements.size() <= 100)
	{
		String measurement = packData();
		Measurements.add(measurement);
	}
}
private void doSendData()
{
	while(true)
	{
		try {
			   if(Measurements.isEmpty())
			   {
				   Thread.sleep(1000);
				   continue;
			   }
	           //Log.d("TCP", "C: Connecting...");
	           Socket socket = new Socket();
	           socket.setTcpNoDelay(true);
	           socket.connect(new InetSocketAddress(serverAddress, portNumber), 3000);
	           //socket.connect(new InetSocketAddress(serverAddress, portNumber));
	           if(!socket.isConnected())
	           {
	        	   throw new Exception("Server Unavailable!");
	           }
	               try {
	                //Log.d("TCP", "C: Sending: '" + message + "'");
	                PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
	                String message = Measurements.remove();
	                out.println(message);
	                Thread.sleep(200);
	                Log.d("TCP", "C: Sent.");
	                Log.d("TCP", "C: Done.");
	                connectionAvailable = true;
	             } catch(Exception e) {
	                 Log.e("TCP", "S: Error", e);
	                 connectionAvailable = false;
	               } finally {
	                  socket.close();
	                  announceNetworkAvailability(connectionAvailable);
	                }
	         } catch (Exception e) {
	              Log.e("TCP", "C: Error", e);
	              connectionAvailable = false;
	              announceNetworkAvailability(connectionAvailable);
	         }
	}
}
}
After I close the application the phone works really slow and I guess it is due to thread termination failure.
Does anyone know what is the best way to terminate all threads before terminating the application?