Lazy Ninja
Lazy Ninja

Reputation: 22537

AsyncTask not running asynchronously

The following were supposed to be the same if I am not mistaking.
Using AsyncTask:

private class GetDataTask extends AsyncTask<String, Void, String>{

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected String doInBackground(String... params) {
        return NetConnection.getRecordData(mUserId, mUserPassword);
    }

    @Override
    protected void onPostExecute(String result) {
        parseJson(result);
    }
}

Using a Thread:

    new Thread( new Runnable() {

        @Override
        public void run() {
            String res = NetConnection. getRecordData(mUserId, mUserPassword);
            parseJson(res);

        }
    }).start();

But when uploading a file, the AsyncTask runs synchronously while the Thread run asynchronously(in parallel).
Why is so? Why AsyncTask behaves like this? Isn't AsyncTask supposed to run asynchronously?
I am little confused so I need your help.
This is how I invoke the GetDataTask:

new GetDataTask().execute()

I prefer using AsyncTask but it is not doing the job for me. Please refer to my early question for more details

Upvotes: 6

Views: 2645

Answers (4)

Praful Bhatnagar
Praful Bhatnagar

Reputation: 7435

Ok following are the notes from the official java doc...

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.

SO if you invoke two AsyncTask together.. they would not be executed in parallel (exception is donut, encliar and gingerbread)... You can use executeOnExecutor to execute them in parallel...

Upvotes: 3

David Olsson
David Olsson

Reputation: 8225

As of 4.x calling 2 AsyncTasks will cause them to be executed serially.

One way to fix this is using the following code

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
  myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
else {
  myTask.execute();
}

You can read more at: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

Upvotes: 11

Dmitry Zaytsev
Dmitry Zaytsev

Reputation: 23982

Looks like that actual problem is not in file uploading but in parseJson method.

In your Thread example you parsing Json in separate thread while in AsyncTask case you parsing Json in UI thread.

Upvotes: 0

user370305
user370305

Reputation: 109257

From your code we can see you have called parseJson(result); in onPostExecute() of AsyncTask which runs in MainUIThread of Applications. So at that point your code runs Synchronously..

Put parseJson(result); method in doInBackGround() Which runs only in other worker thread.

While you have called same thing in Thread. So both

String res = NetConnection. getRecordData(mUserId, mUserPassword);
parseJson(res);

Runs in other worker thread out of MAinUiThread on which you experienced Asynchronously.

Note:

But be sure your parseJson(res); doesn't update UI while it is in doInBackground().

Upvotes: 2

Related Questions