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.