Stopping AsyncTask causes Service to end

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

Leave a Comment