AsyncTask; DoInbackground () не вызывается после вызова метода onPreExecute ()

Я добавил асинхронную библиотеку в свой проект и уже проверил, я не знаю, почему поток кода не входит в asynctask

Код

public void doMysql() { Log.v("doMysql", "accessed"); new AsyncTask<Void, Void, String>() { @Override protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Override protected String doInBackground(Void... params) { Log.v("AsyncTask", "doInBackground"); String msg = ""; DefaultHttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://172.16.100.172:52273/mysql"); ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("myday", Integer.toString(day_picker.getYear()) + addZero(day_picker.getMonth() + 1) + addZero(day_picker.getDayOfMonth()))); nameValuePairs.add(new BasicNameValuePair("mystar", changeStar(day_picker.getMonth() + 1, day_picker.getDayOfMonth()))); nameValuePairs.add(new BasicNameValuePair("mybt", changeBloodType(blood_picker.getValue()))); nameValuePairs.add(new BasicNameValuePair("mynum", "" + myPhone.getText())); nameValuePairs.add(new BasicNameValuePair("yournum", "" + partnerPhone.getText())); nameValuePairs.add(new BasicNameValuePair("myregID", regid)); try { Log.v("setEntity", "before"); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); Log.v("setEntity", "after"); } catch (UnsupportedEncodingException e1) { Log.v("UnsupportedEncodingException", ""); e1.printStackTrace(); } //172.16.101.28 try { Log.v("post", "before"); HttpResponse httpresponse = httpclient.execute(httppost); Log.v("post", "after"); Log.v("HttpResponse ",httpresponse.getEntity().toString()); } catch (ClientProtocolException e) { Log.v("ClientProtocolException", "ClientProtocolException"); e.printStackTrace(); } catch (IOException e) { Log.v("IOException", "IOException"); e.printStackTrace(); } return msg; } @Override protected void onPostExecute(String msg) { Log.v("AsyncTask", "onPostExecute"); } }.execute(null, null, null); } 

У меня есть оператор журнала в коде 'Log.v («AsyncTask», «doInBackground»);

Но он не отображается в журнале Log.v («AsyncTask», «doInBackground»);

Вы должны выполнить свою задачу с помощью исполнителя

 task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

Потому что в более низких версиях Android все AsyncTasks выполнялись в одном фоновом потоке. Поэтому новые задачи могут ждать, пока не будет работать другая задача.

В более низких версиях в Android (фактически на pre-HONEYCOMB) вы не можете выполнить AsyncTask на исполнителе.

Измените свой код на

 public void executeAsyncTask() { AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() { @Override protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Override protected String doInBackground(Void... params) { Log.v("AsyncTask", "doInBackground"); String msg = null; // some calculation logic of msg variable return msg; } @Override protected void onPostExecute(String msg) { Log.v("AsyncTask", "onPostExecute"); } }; if(Build.VERSION.SDK_INT >= 11/*HONEYCOMB*/) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { task.execute(); } } 

Я был в той же ситуации.

  1. Я позвонил AsyncTask.cancel (boolean mayInterruptIfRunning), передав true
  2. Затем я предположил (я был неправ), что doInBackground этой задачи теперь прерван

Добавляя логические операторы, я понял, что первая задача async все еще работает … таким образом, предотвращая выполнение другого асинхронного тэга. Это метод doInBackground запускал бесконечный цикл while, поэтому мне просто пришлось изменить условие, чтобы рассмотреть все возможные «прерывающие» случаи …

Цитирование документации для Android для задачи Async

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

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

Используйте этот фрагмент для запуска AsyncTask:

 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) asyncTaskInstance.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); else pdfPageChanger.execute(params); 

Это не работает для вас?

 task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

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

В моем случае AsyncTask.THREAD_POOL_EXECUTOR (использовать отладчик для получения ваших свойств исполнителя) имел свойства ff:

 maximumPoolSize = 3 largetsPoolSize = 2 corePoolSize =2 

Таким образом, отключение одной из длительных асинхронных задач заставило мой код doInBackground работать, но это не правильное решение.

Правильное решение заключается в том, что я переносил длительные задачи в пользовательские потоки, а не с помощью AsyncTask .

Intereting Posts
Appium на Android – SendKeys в EditText также отображает текст по умолчанию Получение исключения в качестве состояния сохранения отказа: активный Фрагмент очистил индекс: -1, когда я нажимаю кнопку «домой» устройства Android Как сделать программу Android «wait» Разработка 3D-игры на платформе Android с движком физики Bullet NetworkOnMainThreadException с модификацией-бета2 и rxjava Как проверить WiFi – это пройти через вход в веб-страницу? Python 3.3.2+ на Android Пользовательский макет для элемента Spinner NestedScrollView, содержащий контент меньший, чем высота экрана. Прокрутки в CoordinatorLayout Android vpn приложение, использующее android vpnservice Как установить обе строки в ListView с помощью simple_list_item_2? Бесконечный ObjectAnimator с интерполятором … Как ускорить только начальный старт? Eclipse пытается создать файлы в моих каталогах .svn … как я могу сказать, чтобы это остановилось? ArrayIndexOutOfBoundsException при использовании ListAdapter Android – отключить поддержку экрана x больших экранов