I have an AsynTask that crashes the whole application when doInBackground method calls another class that tries to show an alertdialog.
The following is my AsynTask,
private class ReserveAppointmentTask extends AsyncTask<Void, Void, Void>{
@Override
protected void onPreExecute() {
showDialog(RESERVING_PROGRESS_DIALOG);
}
@Override
protected Void doInBackground(Void... params) {
WebServiceResponse.appointmentReservation(AppointmentConfirmationActivity.this, appointmentObj);
return null;
}
@Override
protected void onPostExecute(Void response) {
removeDialog(RESERVING_PROGRESS_DIALOG);
}
}
The WebserviceResponse.appointmentReservation method contains the following code and I know for a fact that it enters the if condition stated below,
public static void appointmentReservation(AppointmentConfirmationActivity activity, Appointment appointmentObj){
SetAppointmentResponse setAppointmentResponse = SetAppointmentResponse.extractJSONResponse(response);
if(setAppointmentResponse.checkResponse()== RESPONSES.SUCCESSFULL){
Dialogs.initAppointmentReservedDialog(activity);
}
}
The Dialogs.initAppointmentReservedDialog contains the following,
public static void initAppointmentReservedDialog(final Activity activity){
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(activity.getString(R.string.appointment_reserved_dialog)).setCancelable(false).setPositiveButton(activity.getString(R.string.ok_button_dialog), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent nextScreen = new Intent(activity, MainOptionsActivity.class);
activity.startActivity(nextScreen);
}
});
AlertDialog alert = builder.create();
alert.show();
}
I get the following fatal exception in my log,
07-18 10:59:34.882: E/AndroidRuntime(4885): FATAL EXCEPTION: AsyncTask #2
07-18 10:59:34.882: E/AndroidRuntime(4885): java.lang.RuntimeException: An error occured while executing doInBackground()
07-18 10:59:34.882: E/AndroidRuntime(4885): at android.os.AsyncTask$3.done(AsyncTask.java:278)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.lang.Thread.run(Thread.java:856)
07-18 10:59:34.882: E/AndroidRuntime(4885): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-18 10:59:34.882: E/AndroidRuntime(4885): at android.os.Handler.<init>(Handler.java:121)
07-18 10:59:34.882: E/AndroidRuntime(4885): at android.app.Dialog.<init>(Dialog.java:107)
07-18 10:59:34.882: E/AndroidRuntime(4885): at android.app.AlertDialog.<init>(AlertDialog.java:114)
07-18 10:59:34.882: E/AndroidRuntime(4885): at android.app.AlertDialog$Builder.create(AlertDialog.java:913)
07-18 10:59:34.882: E/AndroidRuntime(4885): at org.digitalhealthagency.elaj.util.Dialogs.initAppointmentReservedDialog(Dialogs.java:277)
07-18 10:59:34.882: E/AndroidRuntime(4885): at org.digitalhealthagency.elaj.webservice.WebServiceResponse.appointmentReservation(WebServiceResponse.java:288)
07-18 10:59:34.882: E/AndroidRuntime(4885): at org.digitalhealthagency.elaj.gui.AppointmentConfirmationActivity$ReserveAppointmentTask.doInBackground(AppointmentConfirmationActivity.java:182)
07-18 10:59:34.882: E/AndroidRuntime(4885): at org.digitalhealthagency.elaj.gui.AppointmentConfirmationActivity$ReserveAppointmentTask.doInBackground(AppointmentConfirmationActivity.java:1)
07-18 10:59:34.882: E/AndroidRuntime(4885): at android.os.AsyncTask$2.call(AsyncTask.java:264)
07-18 10:59:34.882: E/AndroidRuntime(4885): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-18 10:59:34.882: E/AndroidRuntime(4885): ... 4 more
I would appreciate any help.
Reason as @PareshMayani said: You can’t update UI while doing inside
doInBackground(). Yes you can but for that you have to include eitherrunOnUiThread()or useonPostExecute()I would suggest such changes to update UI after the process
now change your method
appointmentReservation()like this