title: How to handle slow network connection in Java/Android
body: <p>I have an app that uses many, many calls to a MySQL database; it does this inside an <code>AsyncTask</code>.  Below is a sample of what one may look like.</p>
  
  <p>My main question is this; sometimes, the host (Godaddy, ugh) decides to stall a connection and my <code>progressDialog</code> loads, and loads, and loads some more, until there is a force close and the app crashes.  Especially if the user tries to interrupt it (most I have set to non-cancelable, however).</p>
  
  <p>Is there a better way to handle this than I am below?  I am doing it in a <code>try</code>/<code>catch</code>, but not sure how to use that to my advantage.</p>
  
  <pre><code>class Task extends AsyncTask&lt;String, String, Void&gt; {
          private ProgressDialog progressDialog = new ProgressDialog(
                  MasterCat.this);
          InputStream is = null;
          String result = "";
  
          protected void onPreExecute() {
              progressDialog.setMessage("Loading...");
              progressDialog.show();
              progressDialog.setCancelable(false);
          }
  
          @Override
          protected Void doInBackground(String... params) {
              String url_select = "http://www.---.com/---/master.php";
  
              HttpClient httpClient = new DefaultHttpClient();
              HttpPost httpPost = new HttpPost(url_select);
              ArrayList&lt;NameValuePair&gt; param = new ArrayList&lt;NameValuePair&gt;();
  
              try {
                  httpPost.setEntity(new UrlEncodedFormEntity(param));
                  HttpResponse httpResponse = httpClient.execute(httpPost);
                  HttpEntity httpEntity = httpResponse.getEntity();
  
                  // read content
                  is = httpEntity.getContent();
  
              } catch (Exception e) {
  
                  Log.e("log_tag", "Error in http connection " + e.toString());
              }
              try {
                  BufferedReader br = new BufferedReader(
                          new InputStreamReader(is));
                  StringBuilder sb = new StringBuilder();
                  String line = "";
                  while ((line = br.readLine()) != null) {
                      sb.append(line + "\n");
                  }
                  is.close();
                  result = sb.toString();
  
              } catch (Exception e) {
                  // TODO: handle exception
                  Log.e("log_tag", "Error converting result " + e.toString());
              }
  
              return null;
  
          }
  
          protected void onPostExecute(Void v) {
  
              String cat;
              try {
                  jArray = new JSONArray(result);
                  JSONObject json_data = null;
                  for (int i = 0; i &lt; jArray.length(); i++) {
                      json_data = jArray.getJSONObject(i);
                      cat = json_data.getString("category");
  
                      cats.add(cat);
  
                  }
              } catch (JSONException e1) {
                  Toast.makeText(getBaseContext(), "No Categories Found",
                          Toast.LENGTH_LONG).show();
              } catch (ParseException e1) {
                  e1.printStackTrace();
              }
  
              ListView listView = getListView();
              listView.setTextFilterEnabled(true);
  
              listView.setOnItemClickListener(new OnItemClickListener() {
  
                  public void onItemClick(AdapterView&lt;?&gt; arg0, View arg1,
                          int arg2, long id) {
  
                      Intent i = new Intent(getApplicationContext(), Items.class);
                      i.putExtra("category", cats.get(arg2));
                      startActivity(i);
  
                  }
              });
  
              progressDialog.dismiss();
  
              MasterCatAdapter adapter = new MasterCatAdapter(MasterCat.this,
                      cats);
              setListAdapter(adapter);
  
          }
      }
  </code></pre>
  
  <p>Edit:  Now I AM assuming the force close is because of the poor connection; but I will try to get alogcat up when I can recreate it.</p>
  
  <p>Edit2: here is LogCat:</p>
  
  <pre><code>08-13 14:57:00.580: E/WindowManager(2262): Activity com.---.---.MyFragmentActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42b02cd0 that was originally added here
  08-13 14:57:00.580: E/WindowManager(2262): android.view.WindowLeaked: Activity com.---.---.MyFragmentActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42b02cd0 that was originally added here
  08-13 14:57:00.580: E/WindowManager(2262):  at android.view.ViewRootImpl.&lt;init&gt;(ViewRootImpl.java:374)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.view.Window$LocalWindowManager.addView(Window.java:547)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.app.Dialog.show(Dialog.java:277)
  08-13 14:57:00.580: E/WindowManager(2262):  at com.---.---.MyFragmentActivity$RateFragment$RatingTask.onPreExecute(MyFragmentActivity.java:374)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.execute(AsyncTask.java:534)
  08-13 14:57:00.580: E/WindowManager(2262):  at com.---.---.MyFragmentActivity$RateFragment$insertTask.onPostExecute(MyFragmentActivity.java:520)
  08-13 14:57:00.580: E/WindowManager(2262):  at com.---.---.MyFragmentActivity$RateFragment$insertTask.onPostExecute(MyFragmentActivity.java:1)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.finish(AsyncTask.java:631)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.Handler.dispatchMessage(Handler.java:99)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.os.Looper.loop(Looper.java:137)
  08-13 14:57:00.580: E/WindowManager(2262):  at android.app.ActivityThread.main(ActivityThread.java:4745)
  08-13 14:57:00.580: E/WindowManager(2262):  at java.lang.reflect.Method.invokeNative(Native Method)
  08-13 14:57:00.580: E/WindowManager(2262):  at java.lang.reflect.Method.invoke(Method.java:511)
  08-13 14:57:00.580: E/WindowManager(2262):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
  08-13 14:57:00.580: E/WindowManager(2262):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  08-13 14:57:00.580: E/WindowManager(2262):  at dalvik.system.NativeStart.main(Native Method)
  08-13 14:57:00.588: D/AndroidRuntime(2262): Shutting down VM
  08-13 14:57:00.588: W/dalvikvm(2262): threadid=1: thread exiting with uncaught exception (group=0x4200b300)
  08-13 14:57:00.596: E/AndroidRuntime(2262): FATAL EXCEPTION: main
  08-13 14:57:00.596: E/AndroidRuntime(2262): java.lang.NullPointerException
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.---.---.MyFragmentActivity$RateFragment$RatingTask.onPostExecute(MyFragmentActivity.java:461)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.---.---.MyFragmentActivity$RateFragment$RatingTask.onPostExecute(MyFragmentActivity.java:1)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.AsyncTask.finish(AsyncTask.java:631)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.Handler.dispatchMessage(Handler.java:99)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.Looper.loop(Looper.java:137)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.app.ActivityThread.main(ActivityThread.java:4745)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at java.lang.reflect.Method.invokeNative(Native Method)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at java.lang.reflect.Method.invoke(Method.java:511)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  08-13 14:57:00.596: E/AndroidRuntime(2262):     at dalvik.system.NativeStart.main(Native Method)
  </code></pre>
  
  <p>Edit:  Here is the Task that is in a different activity but being referenced in LogCat:</p>
  
  <pre><code>class RatingTask extends AsyncTask&lt;String, String, Void&gt; {
  
              private ProgressDialog progressDialog = new ProgressDialog(
                      getActivity());
  
              InputStream is = null;
              String result = "";
  
              protected void onPreExecute() {
                  progressDialog.setMessage("Loading...");
                  progressDialog.show();
                  progressDialog.setOnCancelListener(new OnCancelListener() {
  
                      public void onCancel(DialogInterface dialog) {
                          RatingTask.this.cancel(true);
                      }
                  });
              }
  
              @Override
              protected Void doInBackground(String... params) {
                  String url_select = "http://www.---.com/---/get_ratings.php";
  
                  ArrayList&lt;NameValuePair&gt; param = new ArrayList&lt;NameValuePair&gt;();
                  param.add(new BasicNameValuePair("item", Item));
                  param.add(new BasicNameValuePair("category", Category));
  
                  HttpClient httpClient = new DefaultHttpClient();
                  HttpPost httpPost = new HttpPost(url_select);
  
                  try {
                      httpPost.setEntity(new UrlEncodedFormEntity(param));
                      HttpResponse httpResponse = httpClient.execute(httpPost);
                      HttpEntity httpEntity = httpResponse.getEntity();
  
                      // read content
                      is = httpEntity.getContent();
  
                  } catch (Exception e) {
  
                      Log.e("log_tag", "Error in http connection " + e.toString());
                  }
                  try {
                      BufferedReader br = new BufferedReader(
                              new InputStreamReader(is));
                      StringBuilder sb = new StringBuilder();
                      String line = "";
                      while ((line = br.readLine()) != null) {
                          sb.append(line + "\n");
                      }
                      is.close();
                      result = sb.toString();
  
                  } catch (Exception e) {
                      Log.e("log_tag", "Error converting result " + e.toString());
                  }
  
                  return null;
  
              }
  
              protected void onPostExecute(Void v) {
  
                  String starTotal = null, starAvg = null;
                  try {
                      JSONArray jArray = new JSONArray(result);
                      JSONObject json_data = null;
                      for (int i = 0; i &lt; jArray.length(); i++) {
                          json_data = jArray.getJSONObject(i);
  
                          starTotal = json_data.getString("TotalRating");
                          starAvg = json_data.getString("AverageRating");
  
                      }
                  } catch (JSONException e1) {
                      Log.e("log_tag",
                              "Error in http connection " + e1.toString());
                      Toast.makeText(getActivity(), "JSONexception",
                              Toast.LENGTH_LONG).show();
                  } catch (ParseException e1) {
                      e1.printStackTrace();
                  }
  
                  int total = 0;
  
                  if (starTotal != null) {
                      total = Integer.parseInt(starTotal);
                  } else {
                      starTotal = "0";
                  }
  
                  if (total &gt; 0) {
                      total = Integer.parseInt(starTotal);
                  } else {
                      total = 0;
                  }
  
                  StarTotal = (TextView) getActivity().findViewById(
                          R.id.tvStarTotal);
                  StarTotal.setText("(" + String.valueOf(total) + (")"));
  
                  float avg = 0.f;
                  try {
                      avg = Float.parseFloat(starAvg);
                  } catch (NumberFormatException e) {
                      avg = 0;
                  }
  
                  DecimalFormat myFormat = new DecimalFormat("0.00");
                  StarNumbers = (TextView) getActivity().findViewById(
                          R.id.tvStarNumber);
                  StarNumbers.setText(myFormat.format(avg));
  
                  ratingsBarTwo.setRating(Float.valueOf(avg));
                  progressDialog.dismiss();
              }
          }
  </code></pre>