Android how to display dialog box from try catch error?

In my application, I connect to the website to collect some information at startup using AsyncTask, using a catch attempt, from here I can display an error in my catlog if it is connected, but I tried to successfully display a dialog box with a failure message connection with parameters for reconnecting or shutting down, please check my code and tell me what I'm doing wrong, or an idea on how to execute this

//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 will try to add the following 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, my application crashes in the if statement line in onPostExecute. I still need some help.

+4
source share
3 answers

Since you are returning a String object from protected String doInBackground(String... aurl) , you return some custom error string from the catch block and access it in protected void onPostExecute(String unused) . Check if the returned String object is a custom error string and displays the dialog in protected void onPostExecute(String unused) , but only after rejecting progressDialog ie after this string dismissDialog(DIALOG_DOWNLOAD_PROGRESS); shows a dialog box with an error.

EDIT

When the control enters the Catch block, return some simple string similar to the one you used "ERROR_IN_CODE".

 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 in onPostExecute(String unused) check the following

 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); } } 
+2
source

Try calling your runOnUiThread () method

 activity.runOnUiThread(new Runnable() { public void run() { //your alert dialog builder here }); 
+1
source

you are not using builder to create an AlertDialog remove the line builder.show() and add

 AlertDialog alert = builder.create(); alert.show(); 

I also recommend updating the user interface using progressUpdate() or preExecute() and the "postExecute ()" task of asyc.

Implementation

 @ReactMethod public void showCustomAlert(String msg){ final String message = msg; this.reactContext.runOnUiQueueThread(new Runnable() { @Override public void run() { AlertDialog.Builder myDialogBox = new AlertDialog.Builder(reactContext.getCurrentActivity()); myDialogBox.setTitle(Html.fromHtml("<font color='#0037FF'>Konnect</font>")); myDialogBox.setMessage(message); myDialogBox.setCancelable(true); myDialogBox.setPositiveButton("Ok", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }); AlertDialog alertDialog = myDialogBox.create(); if (Build.VERSION.SDK_INT <= 23) { alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); }else { alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE); } alertDialog.show(); WindowManager.LayoutParams wmlp = alertDialog.getWindow().getAttributes(); wmlp.gravity = Gravity.TOP | Gravity.LEFT; wmlp.x = 25; //x position wmlp.y = 450; //y position wmlp.height = 380; alertDialog.show(); alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); } }); } 
0
source

All Articles