Where to stop/destroy threads in Android Service class?

Posted by niko on Stack Overflow See other posts from Stack Overflow or by niko
Published on 2009-03-25T04:04:24Z Indexed on 2010/06/10 12:22 UTC
Read the original article Hit count: 731

Filed under:
|
|

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?

© Stack Overflow or respective owner

Related posts about android

Related posts about multithreading