Android, how to display a dialog box from a try catch error?
In my application I connect to a
website to gather some information at the beginning with AsyncTask, using try catch, from here I can show errors on connection in my catlog, but I’ve been trying, but bad luck shows a dialog box showing connection failure and options to reconnect or exit, check my code and tell me what I’m doing wrong or ideas on how to get this done
//this is our download file asynctask
class DownloadFileAsync extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... aurl) {
try {
String result = "";
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://mywebsiteaddress");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream webs = entity.getContent();
convert response to string
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(webs, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
webs.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
webResult resultRow = new webResult();
infotodownload
arrayOfWebData.add(resultRow);
}
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
} catch (Exception e) {
this is the line of code that sends a real error message to the
.log
Log.e("ERROR", "ERROR IN CODE: " + e.toString());
this is the line that prints out the location in
the code where the error occurred.
e.printStackTrace();
}
return null;
}
protected void onProgressUpdate(String... progress) {
Log.d(LOG_TAG,progress[0]);
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
dismiss the dialog after the file was downloaded
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
our progress bar settings
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS: //we set this to 0
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle("Conectando al Servidor");
mProgressDialog.setMessage("Cargando informacion...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setCancelable(true);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
Edit:
Then I tried to add the next code as suggested by Arun
catch (Exception e) {
this is the line of code that sends a real error message to the
.log
Log.e("ERROR", "ERROR IN CODE: " + e.toString());
this is the line that prints out the location in
the code where the error occurred.
e.printStackTrace();
return "ERROR_IN_CODE";
}
return null; if I place here return "ERROR_IN_CODE" it calls the dialog but it gets always called so I don't need it here
}
@Override
protected void onPostExecute(String unused) {
dismiss the dialog after the file was downloaded
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
if(unused.equals("ERROR_IN_CODE")){ //I get a system crash here!
errornote();
}
}
}
public void errornote() {
AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
alt_bld.setMessage("No se a podido descargar la informacion de los medios, deseas reintentarlo, o salir?"). setCancelable(false)
.setPositiveButton("Conectar de Nuevo", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
new DownloadFileAsync().execute();
}
})
.setNegativeButton("Salir", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Action for 'NO' Button
finish();
}
});
AlertDialog alert = alt_bld.create();
Title for AlertDialog
alert.setTitle("Error en la Conexion!");
Icon for AlertDialog
alert.setIcon(android. R.drawable.ic_dialog_alert);
alert.show();
}
But it doesn’t work either, my app crashes in the if statement line of onPostExecute. I still need help.
Solution
Since you started with protected String doInBackground(String... aurl)
returns a String object, so some custom error strings are returned from the catch block and in the protected void onPostExecute (string not used).
Checks whether the returned string object is a custom error string and displays a dialog box in protected void onPostExecute(String unused),
but only after closing progressDialog, that is, after the line dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
An error dialog box is displayed.
Edit
When the control enters a Catch block, it returns some simple strings, such as the “ERROR_IN_CODE” you used.
catch (Exception e) {
this is the line of code that sends a real error message to the
.log
Log.e("ERROR", "ERROR IN CODE: " + e.toString());
this is the line that prints out the location in
the code where the error occurred.
e.printStackTrace();
return "ERROR_IN_CODE";
}
And check the following at onPostExecute(String unused).
protected void onPostExecute(String unused) {
dismiss the dialog after the file was downloaded
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
if(unused != null && unused.equals("ERROR_IN_CODE")){
showDialog(SOME_DIALOG_TO_SHOW_ERROR);
}
}