Вызовите несколько AsyncTask за время, не работающее в Android

Я хочу вызвать несколько AsynTask . Он не работал, поэтому я помог Google. Я обнаружил, что если я использую AsyncTask.THREAD_POOL_EXECUTOR тогда он будет работать.

Но это не работает.

Я называю это следующим:

 new GetCategory().execute(); new GetArea().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

Пожалуйста, помогите мне в решении этой проблемы. Я хочу назвать это одновременно, или это нормально, если GetArea() вызывается после GetCategory() . Я не ошибаюсь. Приложение может делать слишком много работы.
Logcat:

 03-13 21:21:43.134: I/Choreographer(1222): Skipped 39 frames! The application may be doing too much work on its main thread. 03-13 21:21:43.394: I/Choreographer(1222): Skipped 43 frames! The application may be doing too much work on its main thread. 03-13 21:21:43.634: I/Choreographer(1222): Skipped 36 frames! The application may be doing too much work on its main thread. 03-13 21:21:43.784: I/Choreographer(1222): Skipped 38 frames! The application may be doing too much work on its main thread. 03-13 21:21:44.004: I/Choreographer(1222): Skipped 56 frames! The application may be doing too much work on its main thread. 03-13 21:21:44.164: I/Choreographer(1222): Skipped 36 frames! The application may be doing too much work on its main thread. 03-13 21:21:45.495: I/Choreographer(1222): Skipped 33 frames! The application may be doing too much work on its main thread. 03-13 21:21:45.765: I/Choreographer(1222): Skipped 43 frames! The application may be doing too much work on its main thread. 03-13 21:21:46.005: I/Choreographer(1222): Skipped 36 frames! The application may be doing too much work on its main thread. 03-13 21:21:46.235: I/Choreographer(1222): Skipped 44 frames! The application may be doing too much work on its main thread. 03-13 21:21:46.525: I/Choreographer(1222): Skipped 48 frames! The application may be doing too much work on its main thread. 03-13 21:21:46.855: I/Choreographer(1222): Skipped 39 frames! The application may be doing too much work on its main thread. 03-13 21:21:47.005: I/Choreographer(1222): Skipped 39 frames! The application may be doing too much work on its main thread. 03-13 21:21:47.156: I/Choreographer(1222): Skipped 37 frames! The application may be doing too much work on its main thread. 03-13 21:21:47.306: I/Choreographer(1222): Skipped 38 frames! The application may be doing too much work on its main thread. 

Я связываю Spinner на обоих AsynTask .
Мой код:

  Area[] areaList = gson.fromJson(result, Area[].class); List<Area> lList = Arrays.asList(areaList); Area objArea; areaId.add("0"); areaName.add("Select Area"); for (int i = 0; i < lList.size(); i++) { objArea = lList.get(i); areaName.add(objArea.getAreaName()); areaId.add(objArea.getAreaId()); } ArrayAdapter<String> adapter = new ArrayAdapter<String>( getActivity(), android.R.layout.simple_dropdown_item_1line, areaName); ((Spinner) spnCEArea).setAdapter(adapter); 

Причина, по которой вы не можете одновременно вызвать два .execute() в AsyncTask в рамках одного и того же проекта, – это модификация, введенная Android с Gingerbread . До этой версии вы могли вызывать .execute() столько раз, сколько вам нужно, поскольку каждый из них запускался в отдельном Thread .

Но с этой версией они называются последовательно, поэтому если один выполняется, другой не запускается, если вы просто вызываете .execute() .

Таким образом, в основном все, что вам нужно сделать, это проверить версию устройства, на котором запущена AsyncTask и запустить ту или иную команду в зависимости от нее.

 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) your_asynctask.execute(your_params); else your_asynctask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, your_params); 

Больше информации здесь .

Кстати, The application may be doing too much work on its main thread. Строки не связаны с AsyncTask . Эти задачи выполняются в фоновом режиме, и если вы выполняете работу в своем doInBackground() , это не проблема.

Может быть, немного отличается, если вы выполняете какую-то работу в своей функции onPostExecute() , так как это может быть связано с вашим основным пользовательским интерфейсом, но мы не можем рассказать вам больше, не зная, какой код вы используете.

Отредактировано:

 @Override public void doInBackground(params.....){ //Your other code goes here Area[] areaList = gson.fromJson(result, Area[].class); List<Area> lList = Arrays.asList(areaList); Area objArea; areaId.add("0"); areaName.add("Select Area"); for (int i = 0; i < lList.size(); i++) { objArea = lList.get(i); areaName.add(objArea.getAreaName()); areaId.add(objArea.getAreaId()); } ArrayAdapter<String> adapter = new ArrayAdapter<String>( getActivity(), android.R.layout.simple_dropdown_item_1line, areaName); } @Override public void onPostExecute(Params..){ ((Spinner) spnCEArea).setAdapter(adapter); } 

Таким образом, вы размещаете всю свою рабочую нагрузку в doInBackground и просто устанавливаете адаптер для listView в onPostExecute. Это правильный путь. И я уверен, что это решает проблему.

Я могу использовать 2 asynctasks с:

 new GetCategory().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); new GetArea().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,""); 

Если он не работает и сбой, отправьте свой логарифм. Если он отправит ваш код.

Правильный синтаксис

 Executor exec = AsyncTask.THREAD_POOL_EXECUTOR; new GetCategory().executeOnExecutor(exec); new GetArea().executeOnExecutor(exec); 

Но читайте предупреждение здесь http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor(java.util.concurrent.Executor , Params …) Вероятно, это не то, что вы хотите.

Простой способ запуска нескольких приложений AsyncTask использует SERIAL_EXECUTOR http://developer.android.com/reference/android/os/AsyncTask.html#SERIAL_EXECUTOR

В основном:

 new GetCategory().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); new GetArea().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);