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" );
Ответы
Ответ 1
Вы должны выполнить свою задачу с помощью исполнителя
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();
}
}
Ответ 2
Я был в такой же ситуации.
- Я сделал вызов
AsyncTask.cancel(boolean mayInterruptIfRunning)
передав истину - Затем я предположил (я был не прав), что
doInBackground()
этой задачи теперь прервано
Добавив операторы logs, я понял, что самый первый asyncTask
все еще работает... тем самым предотвращая выполнение другого asyncTask
. В doInBackground()
метод doInBackground()
выполнял бесконечный цикл while, поэтому мне просто пришлось изменить условие, чтобы рассмотреть все возможные случаи "перерыва"...
Ответ 3
Выполнение этого не работает для вас?
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Я уже делал это, и проблема все еще была, проблема заключалась в том, что я использовал AsyncTask
для запуска длинных фоновых задач, которые выполняются навсегда, поэтому рабочие потоки ThreadPoolExecutor
уже заняты.
В моем случае AsyncTask.THREAD_POOL_EXECUTOR
(использовать отладчик для получения ваших свойств исполнителя) имел свойства ff:
maximumPoolSize = 3
largetsPoolSize = 2
corePoolSize =2
Таким образом, отключение одной из длинных асинхронных задач заставило мой код doInBackground работать, но это неправильное решение.
Правильное решение - это перенос длинных задач в пользовательские потоки, а не использование AsyncTask
.
Ответ 4
Цитирование Android-документации для Async Task
При первом представлении 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);