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

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

  1. Я сделал вызов AsyncTask.cancel(boolean mayInterruptIfRunning) передав истину
  2. Затем я предположил (я был не прав), что 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);