0

I would like to know how to handle force stop in my android application. The application contains an asynctask class within the activity as follows:

private class SocketTask extends AsyncTask<String, Void, SocketAnswer> {

    ProgressDialog pd;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        lockOrientation();
        try {
            if (pd == null) {
                try {
                    pd = new ProgressDialog(MenuDisplayActivity.this);
                } catch (Exception e) {
                }
            }
            pd.setMessage(Global.Labels.get(165).toString());
            pd.setCancelable(false);
            pd.show();
        } catch (Exception e) {
        }           
    }

    public SocketTask(MenuDisplayActivity activity) {
        try {
            pd = new ProgressDialog(activity);
        } catch (Exception e) {
        }
    }

    @Override
    protected SocketAnswer doInBackground(String... params) {

The application runs without any exception, however, after a force stop is made by the user (using the Menu Button located in the left of the Home Button at Samsung Galaxy S5), when the application is reopened, it displays the Progress Dialog message "Please wait" located in the onPreExecute method of the asynctask and hangs infinitely.

When I debug, I notice that the application hangs in the Looper class loop method:

public static void loop() {
    final Looper me = myLooper();
    if (me == null) {
        throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
    }
    final MessageQueue queue = me.mQueue;

    // Make sure the identity of this thread is that of the local process,
    // and keep track of what that identity token actually is.
    Binder.clearCallingIdentity();
    final long ident = Binder.clearCallingIdentity();

    for (;;) { //The application gets stuck infinitely in this loop
        Message msg = queue.next(); // might block
        if (msg == null) {
            // No message indicates that the message queue is quitting.
            return;
        }

        // This must be in a local variable, in case a UI event sets the logger
        Printer logging = me.mLogging;
        if (logging != null) {
            logging.println(">>>>> Dispatching to " + msg.target + " " +
                    msg.callback + ": " + msg.what);
        }

        msg.target.dispatchMessage(msg);

        if (logging != null) {
            logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
        }

        // Make sure that during the course of dispatching the
        // identity of the thread wasn't corrupted.
        final long newIdent = Binder.clearCallingIdentity();
        if (ident != newIdent) {
            Log.wtf(TAG, "Thread identity changed from 0x"
                    + Long.toHexString(ident) + " to 0x"
                    + Long.toHexString(newIdent) + " while dispatching to "
                    + msg.target.getClass().getName() + " "
                    + msg.callback + " what=" + msg.what);
        }

        msg.recycle();
    }
}

How could we ensure that the application gets out of this infinite loop?

Thank you.

Best Regards.

Cemil Tatoglu
  • 65
  • 1
  • 10

1 Answers1

0

Finally it's been solved by adding "socketTask.cancel(true);" to the "onDestroy()" method as follows:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (socketTask != null)
        socketTask.cancel(true);
}
Cemil Tatoglu
  • 65
  • 1
  • 10