How to handle slow network connection in Java/Android <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>