I have a service which runs two asynctasks. One is for receiving multicast packets and another for receiving udp packets. I have registered a wifi state listener and want to stop listening for packets when connection to an access point is lost. But when I try closing either of the the sockets and try to end the while loop, the service itself shuts down. I want the service to be running during the entire time until my activity exits. Following are the relevant parts of my code. Brackets might be misplaced...
public class ReceiveService extends Service {
private Receive r;
private ReceiveMulticast rm;
private boolean running = true;
private boolean receive = false, receivemulti = false;
@Override
public IBinder onBind(Intent arg0) {
// return binder;
return null;
}
@Override
public void onCreate() {
try {
r = new Receive();
rm = new ReceiveMulticast();
if (wifi.checkwifi(this)) {//check if connected to access point
wifiInit();
receive();
receivemulti();
}
} catch (Exception e) {
Log.d("test", "exception in oncreate");
//e.printStackTrace();
}
}
public void wifiInit() {
wm = wifi.getWifiManager(this);
myip = wifi.getmyip(wm);
wifi.acquirelock(wm);
}
public void receive() {
r.execute();
receive = true;
}
public void receivemulti() {
rm.execute();
receivemulti = true;
}
private BroadcastReceiver WifiStateChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//monitor changes in wifi state
}
};
@Override
public void onDestroy() {
try {
if (!r.ds1.isClosed())
r.ds1.close();
if (!rm.s.isClosed()) {
rm.s.leaveGroup(rm.group);
rm.s.close();
}
super.onDestroy();
} catch (Exception e) {
Log.d("test", "Exception in destroy");
}
}
private class Receive extends AsyncTask<Void, String, Void> {
private DatagramSocket ds1;
private DatagramPacket p;
protected void onPreExecute() {
}
protected Void doInBackground(Void... params) {
try {
ds1 = new DatagramSocket(7777);
} catch (SocketException e) {
Log.d("test", "Exception in new datagram");
//e.printStackTrace();
}
int buffer_size = 1024;
byte buffer1[] = new byte[buffer_size];
p = new DatagramPacket(buffer1, buffer1.length);
while (running) {
try {
ds1.receive(p);
String sip = p.getAddress().getHostAddress();
String rec = new String(p.getData(), 0, p.getLength());
//publishProgress(sip + "+" + rec);
} catch (Exception e) {
running = false;
}
}
return null;
}
protected void onProgressUpdate(String... progress) {
//do stuff
}
protected void onPostExecute(Void result) {
stopSelf();
}
}
private class ReceiveMulticast extends AsyncTask<Void, String, Void> {
private String ip = "224.0.0.10";
private int port = 6789;
private MulticastSocket s;
private DatagramPacket mp;
private InetAddress group;
protected void onPreExecute() {
}
protected Void doInBackground(Void... params) {
try {
group = InetAddress.getByName(ip);
s = new MulticastSocket(port);
s.joinGroup(group);
} catch (UnknownHostException e1) {
Log.d("test", "exception unknown host rm");
//e1.printStackTrace();
} catch (IOException e) {
Log.d("test", "exception io rm");
//e.printStackTrace();
}
byte[] buffer2 = new byte[1024];
mp = new DatagramPacket(buffer2, buffer2.length);
while (running) {
try {
s.receive(mp);
String sip = mp.getAddress().getHostAddress();
String rec = new String(mp.getData(), 0, mp.getLength());
//publishProgress(sip + "+" + rec);
} catch (Exception e) {
running = false;
}
}
return null;
}
protected void onProgressUpdate(String... progress) {
//do stuff
}
}
protected void onPostExecute(Void result) {
stopSelf();
}
}
}
Stopping normally or stopping with an exception?
You are calling stopSelf()
in the postExecute()
of one of the AsyncTasks. your while(true) ... loop will exit if you get an exception, then postExecute()
is called, which calls stopSelf()
. This is likely the cause, but there's no way of knowing since you don't log the exception.