AsyncTask не работает асинхронно

Следующие должны были быть такими же, если я не ошибаюсь.
Использование 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); } } 

Использование потока :

  new Thread( new Runnable() { @Override public void run() { String res = NetConnection. getRecordData(mUserId, mUserPassword); parseJson(res); } }).start(); 

Но при загрузке файла AsyncTask работает synchronously а Thread работает asynchronously (параллельно).
Почему так? Почему AsyncTask ведет себя так? Не предполагается ли AsyncTask работать асинхронно?
Я немного смущен, поэтому мне нужна ваша помощь.
Вот как я вызываю GetDataTask:

 new GetDataTask().execute() 

Я предпочитаю использовать AsyncTask, но он не выполняет эту работу для меня. Пожалуйста, обратитесь к моему раннему вопросу для получения более подробной информации.

Начиная с вызова 4.x 2 AsyncTasks заставит их запускаться последовательно.

Один из способов исправить это – использовать следующий код

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

Вы можете узнать больше: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

Ниже следуют записи из официального java-документа …

Порядок исполнения

При первом вводе AsyncTasks выполнялись последовательно на одном фоновом потоке. Начиная с DONUT , это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB , задачи выполняются в одном потоке, чтобы избежать общих ошибок приложений, вызванных параллельным выполнением.

 If you truly want parallel execution, you can invoke 

ExecuteOnExecutor (java.util.concurrent.Executor, Object []) с THREAD_POOL_EXECUTOR .

SO, если вы одновременно используете две AsyncTask, они не будут выполняться параллельно (исключение – пончик, encliar и gingerbread) … Вы можете использовать executeOnExecutor для выполнения их parallel

Из вашего кода мы видим, что вы вызвали parseJson(result); В onPostExecute() AsyncTask, который запускается в MainUIThread приложений. Поэтому в этот момент ваш код запускается синхронно.

Поместить parseJson(result); Метод в doInBackGround() который выполняется только в другом рабочем потоке.

Хотя вы назвали то же самое в Thread . Таким образом, оба

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

Запускает другой рабочий поток из MAinUiThread, с которым вы столкнулись асинхронно.

Заметка:

Но будьте уверены, что ваш parseJson(res); Не обновляет интерфейс, пока он находится в doInBackground( ).

Похоже, что актуальная проблема заключается не в загрузке файлов, а в методе parseJson .

В вашем примере Thread вы разбираете Json в отдельном потоке, в то время как в случае AsyncTask вы разбираете Json в потоке пользовательского интерфейса.