call AsyncTask from Broadcast receiver android
android, android-asynctask, broadcastreceiver, java
Solution
Using `AsyncTask` in `BroadcastReceiver` is a bad practice.
You should use `Service` because Android OS may kill your process or `onReceive()` may run to completion before `asyncTask` will return result, so there is no guarantee you will get the expected result.
Problem
SO currently i have an AsyncTask class that runs and POST's data to my server when I click a button(which works great). What im trying to do now is handle what happens when the user is not connected to the internet. so i have set up these classes to notify the app when internet has connected so that the data can be sent automatically to the server. AsyncTask class(inner class) ``` private class HttpAsyncTask extends AsyncTask<String, Void, String> { ProgressDialog dialog = new ProgressDialog(getActivity()); final AlertDialog finishedDialog = new AlertDialog.Builder(getActivity()) .setCancelable(false) .setPositiveButton(android.R.string.ok, null) .create(); @Override protected String doInBackground(String... urls) { onProgressUpdate("Uploading Data..."); return POST(urls[0]); } @Override protected void onPreExecute() { this.dialog.show(); finishedDialog.setOnShowListener(new DialogInterface.OnShowListener(){ @Override public void onShow(DialogInterface dialog) { Button b = finishedDialog.getButton(AlertDialog.BUTTON_POSITIVE); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // navigate to match summary..... finishedDialog.dismiss(); } }); } }); } protected void onProgressUpdate(String msg) { dialog.setMessage(msg); } // onPostExecute displays the results of the AsyncTask. @Override protected void onPostExecute(String result) { if (result != ""){ finishedDialog.setTitle("Upload Complete!"); finishedDialog.setMessage("Data Sent Successfully"); finishedDialog.show(); dialog.dismiss(); editor.clear(); editor.commit(); //Toast.makeText(getActivity().getBaseContext(), result, Toast.LENGTH_LONG).show(); }else { Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { finishedDialog.setTitle("Upload Failed!"); finishedDialog.setMessage("Data Will Automatically Be Uploaded When Internet Connection Is Available"); finishedDialog.show(); dialog.dismiss(); }}, 1000); setFlag(true); } } } public static boolean getFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public String POST(String url){ InputStream inputStream = null; String result = ""; try { // 1. create HttpClient HttpClient httpclient = new DefaultHttpClient(); // 2. make POST request to the given URL HttpPost httpPost = new HttpPost(url); if(adapter.updateNeeded()){ JSONObject main = new JSONObject(exmaplePrefs.getString("jsonString", "cant find json")); JSONObject dbUpdates = new JSONObject(exmaplePrefs.getString("ChangesJSON", "cant find Changejson")); main.put("Team_Updates", dbUpdates); json = main.toString(); }else{ json = exmaplePrefs.getString("jsonString", "cant find json"); // String json = "{\"twitter\":\"test\",\"country\":\"test\",\"name\":\"test\"}"; } // 5. set json to StringEntity StringEntity se = new StringEntity(json); se.setContentType("application/json;charset=UTF-8"); // 6. set httpPost Entity httpPost.setEntity(se); // 7. Set some headers to inform server about the type of the content // httpPost.setHeader("Accept", "application/json"); // httpPost.setHeader("Content-type", "application/json"); // httpPost.setHeader("json", json); // 8. Execute POST request to the given URL HttpResponse httpResponse = httpclient.execute(httpPost); // 9. receive response as inputStream inputStream = httpResponse.getEntity().getContent(); String status = httpResponse.getStatusLine().toString(); // 10. convert inputstream to string if (!status.equals("HTTP/1.1 500 Internal Server Error")){ if(inputStream != null){ result = convertInputStreamToString(inputStream); } else{ result = "Did not work!"; } }else{ System.out.println("500 Error"); } } catch (Exception e) { Log.d("InputStream", e.getLocalizedMessage()); System.out.println("eerroorr "+e); } // 11. return result System.out.println(result); return result; } private static String convertInputStreamToString(InputStream inputStream) throws IOException{ BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream)); String line = ""; String result = ""; while((line = bufferedReader.readLine()) != null) result += line; inputStream.close(); return result; } } ``` NetworkUtil class ``` public class NetworkUtil { public static int TYPE_WIFI = 1; public static int TYPE_MOBILE = 2; public static int TYPE_NOT_CONNECTED = 0; public static int getConnectivityStatus(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (null != activeNetwork) { if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) return TYPE_WIFI; if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) return TYPE_MOBILE; } return TYPE_NOT_CONNECTED; } public static String getConnectivityStatusString(Context context) { int conn = NetworkUtil.getConnectivityStatus(context); String status = null; if (conn == NetworkUtil.TYPE_WIFI) { status = "Wifi enabled"; } else if (conn == NetworkUtil.TYPE_MOBILE) { status = "Mobile data enabled"; } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) { status = "Not connected to Internet"; } return status; } } ``` BroadcastReceiver class ``` public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { intent.getExtras(); String status = NetworkUtil.getConnectivityStatusString(context); Toast.makeText(context, status, Toast.LENGTH_LONG).show(); if(MatchFragment.getFlag()){ //send data } } } ``` So in the BroadcastReceiver class I check the flag that gets set to true when the app attempts to send data but there is not internet (onPostExecute in AsyncTask Class). so what want to do is some how call the POST method. do i have to create a new Async task class? Im a bit stumped here . Thanks