Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - AsyncTask not executing

I know there are already a lot of questions with this title but I still haven't found a solution to work for my case.

I have the following code that gets the users data from an online database. The problem is, as stated in the title, that the AsyncTask doesn't start.

Here's my code:

protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     getData(); // retrieves "friends" data from database     FloatingActionButton btn3 = (FloatingActionButton) findViewById(R.id.button_add_new_friend);     btn3.setBackgroundTintList(getResources().getColorStateList(R.color.Blonde));     btn3.setOnClickListener(new View.OnClickListener() {         @Override         public void onClick(View v) {              LayoutInflater layoutInflater = LayoutInflater.from(profile.this);             View promptView = layoutInflater.inflate(R.layout.input_new_friend, null);             AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(profile.this);             alertDialogBuilder.setView(promptView);              final EditText editText1 = (EditText) promptView.findViewById(R.id.edittext_addnewfriend);              // setup a dialog window             alertDialogBuilder.setCancelable(false)                 .setPositiveButton("OK", new DialogInterface.OnClickListener() {                     public void onClick(DialogInterface dialog, int id) {                          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();                         StrictMode.setThreadPolicy(policy);                          InputStream is = null;                          // add values to the database                         String friend = "" + editText1.getText();                          // Verify the user in the USERS database - get users data from the dabase                         GetDataJSON g = new GetDataJSON();                         g.execute();                                                         if (friends.contains(friend)) // if you are already friends with that user                             Toast.makeText(getApplicationContext(), "You are already friends with that user!",                                 Toast.LENGTH_LONG).show();                         else {                             if (!users.contains(friend)) // the user doesn't exist in our database                                 Toast.makeText(getApplicationContext(), "That user doesn't exist! You either haven't introduced the right email or he's not a registered user within Poinder.",                                     Toast.LENGTH_LONG).show();                         else // the user exists so we add him to the friends list                         {                             //do something                         } }  // Getting the users protected void showList2(){     try {         JSONObject jsonObj = new JSONObject(myJSON);         people = jsonObj.getJSONArray(TAG_RESULTS);          for(int i=0;i<people.length();i++){             JSONObject c = people.getJSONObject(i);             String user = c.getString(TAG_USER);             String email = c.getString(TAG_EMAIL);             Double location_latitude = c.getDouble(TAG_LATITUDE);             Double location_longitude = c.getDouble(TAG_LONGITUDE);              users.add(email);         }      } catch (JSONException e) {         e.printStackTrace();     }  }  // Getting the users private class GetDataJSON extends AsyncTask<Void, Void, String> {      @Override     protected String doInBackground(Void... params) {         DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());         HttpPost httppost = new HttpPost("http://xxxxxxx/friends_out.php");          // Depends on your web service         httppost.setHeader("Content-type", "application/json");          InputStream inputStream = null;         String result = null;         try {             HttpResponse response = httpclient.execute(httppost);             HttpEntity entity = response.getEntity();              inputStream = entity.getContent();             // json is UTF-8 by default             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);             StringBuilder sb = new StringBuilder();              String line = null;             while ((line = reader.readLine()) != null)             {                 sb.append(line + "\n");             }             result = sb.toString();         } catch (Exception e) {             // Oops         }         finally {             try{if(inputStream != null)inputStream.close();}catch(Exception squish){}         }         return result;     }      @Override     protected void onPostExecute(String result){         myJSON=result;         showList2();     } } 

Any idea what other method I should use instead? Or preferably how I should modify this one to work and any ideas why my AsyncTask never starts?

EDIT: I applied all the suggestions mentioned below and unfortunately none of them work so far (my AsyncTask still doesn't start).

And another question: using more than one AsyncTask in the same activity has anything to do with my problem?

like image 373
Diana Avatar asked Aug 12 '15 06:08

Diana


2 Answers

Since (I assume) none of the other suggested solutions work, I suspect that your problem lies in the way AsyncTasks are executed. If multiple AsyncTasks are executing in the same Activity, like in your app, then those AsyncTasks will not execute in parallel. They will execute one after the other.

I suspect that your other AsyncTask(s) are long running, so that your GetDataJSON AsyncTask is waiting for the other tasks to complete.

The solution is to enable parallel execution of AsyncTask. Use the following code to execute AsyncTasks in parallel.

GetDataJSON g = new GetDataJSON(); g.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

From AsyncTask docs:

Order of execution

When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

Hope this helps.

like image 120
David Heisnam Avatar answered Sep 21 '22 00:09

David Heisnam


just change your asyntask parameters

 class GetDataJSON extends AsyncTask<String, Void, String> 

to,

 class GetDataJSON extends AsyncTask<Void, Void, String> 
like image 37
Mayur R. Amipara Avatar answered Sep 20 '22 00:09

Mayur R. Amipara