Создание AsyncTask занимает слишком много времени Android

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

Вот часть моего кода:

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("Temp:",System.currentTimeMillis()+""); new Move().execute(); /*some other logic } } 

И мой AsyncTask:

  private class Move extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... temp) { Log.d("start:",System.currentTimeMillis()+""); gson.fromJson(Web.Request.get(some_URL),Void.class); Log.d("end:",System.currentTimeMillis()+""); return null; } } 

Это журналы, которые я получил:

  32658-998/com.example.game D/temp:﹕ 1408923006159 32658-998/com.example.game D/start:﹕ 1408923035163 32658-998/com.example.game D/end:﹕ 1408923035199 

Таким образом, для достижения первой линии в doInBackground методе потребовалось почти 29 секунд, так как для завершения сетевого вызова потребовалось всего 36 мс. Я много раз пробовал, время было почти в том же порядке.

Можно ли сразу запустить AsyncTask? Или есть ли другой способ решить эту проблему (кроме прогона простого потока?) Спасибо 🙂

Solutions Collecting From Web of "Создание AsyncTask занимает слишком много времени Android"

AsyncTask ожидает, что другие AsyncTask s закончат работу, предположительно, если у вас есть другие запущенные задачи (проверьте, выполняете ли вы).

См. Здесь .

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

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

Если вы действительно хотите выполнить параллельное выполнение, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor, Object []) с помощью THREAD_POOL_EXECUTOR.

Если у вас есть другой AsyncTask, выполняющийся одновременно, ваш AsyncTask, вероятно, ждет завершения предыдущего. Однако вы можете заставить AsyncTasks запускаться в многопоточном режиме

  Move task = new Move(); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); else task.execute(); 

Надеюсь, что это поможет вам, для получения дополнительной информации вы можете прочитать эту полезную тему