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?
Since (I assume) none of the other suggested solutions work, I suspect that your problem lies in the way AsyncTask
s 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.
just change your asyntask parameters
class GetDataJSON extends AsyncTask<String, Void, String>
to,
class GetDataJSON extends AsyncTask<Void, Void, String>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With