Issue
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();
}
}
}
Solution
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.
Answered By – Jeffrey Blattman