Pregunta AsyncTask; doInbackground () no llamado después del método de llamada onPreExecute ()


Agregué una biblioteca asíncrona en mi proyecto y ya la revisé, no sé por qué el flujo de código no entra en asynctask

Código

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);
}

Tengo una declaración de registro en el código 'Log.v ("AsyncTask", "doInBackground");'

Pero no aparece en el registrador 'Log.v ("AsyncTask", "doInBackground");'


15
2017-11-12 15:31


origen


Respuestas:


Debes ejecutar tu tarea con el ejecutor

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Porque en las versiones inferiores de Android todas las AsyncTasks se ejecutaban en una sola cadena de fondo. Así que las nuevas tareas pueden estar esperando, hasta que otra tarea funcione.

En las versiones inferiores de Android (actualmente en preHONEYCOMB) no puede ejecutar AsyncTask en el ejecutor.

Cambia tu código a

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();
    }
}

39
2017-11-12 15:47



Yo estaba en la misma situación.

  1. Hice una llamada a AsyncTask.cancel (boolean mayInterruptIfRunning) pasando true
  2. Entonces asumí (estaba equivocado) que el doInBackground de esta tarea ahora estaba interrumpido

Al agregar instrucciones de registros, me di cuenta de que la primera tarea asíncrona aún se estaba ejecutando ... impidiendo que se ejecutara otra conexión asíncrona. El método doInBackground estaba ejecutando un bucle while infinito, así que simplemente tuve que cambiar la condición para considerar todos los posibles casos de "interrupción" ...


5
2018-05-13 04:06



Citando la documentación de Android para Tarea asincrónica 

Cuando se introdujo por primera vez, AsyncTasks se ejecutaron en serie en un único   hilo de fondo. Comenzando con DONUT, esto fue cambiado a un grupo de   hilos que permiten que múltiples tareas operen en paralelo. Empezando con   HONEYCOMB, las tareas se ejecutan en un único hilo para evitar errores comunes   errores de aplicación causados ​​por la ejecución paralela.

Si realmente quieres la ejecución paralela, puedes invocar   executeOnExecutor (java.util.concurrent.Executor, Object []) con   THREAD_POOL_EXECUTOR.

Use este fragmento para activar AsyncTask:

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

4
2018-05-25 11:46



¿Esto no funciona para ti?

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Ya estaba haciendo esto y el problema todavía estaba allí, el problema era que estaba usando AsyncTask para ejecutar tareas de fondo largas que se ejecutan para siempre, por lo que ThreadPoolExecutorLos hilos de trabajo ya estaban ocupados.

En mi caso AsyncTask.THREAD_POOL_EXECUTOR (use depurador para obtener sus propiedades de ejecutor) estaba teniendo las propiedades ff:

maximumPoolSize = 3
largetsPoolSize = 2
corePoolSize =2 

Así que deshabilitar una de las aplicaciones asyncTasks de larga ejecución hizo que se ejecutara mi código doInBackground, pero esa no es la solución correcta.

La solución correcta es mover las tareas de ejecución prolongada a hilos personalizados en lugar de utilizar AsyncTask.


3
2017-11-05 13:06