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?