¿Es posible que el sistema operativo Android pueda retrasar o suspender mi asynctask por alguna razón? Si es así, ¿qué puedo hacer para asegurarme de que mi tarea (por ejemplo, obtener datos de la base de datos) no se retrase ni se suspenda? Puede ejecutarlo en un hilo de la interfaz de usuario, pero he leído que no es una buena idea, ya que puede congelar la interfaz de usuario y provocar un retraso.

0
Dayem Siddiqui 14 dic. 2016 a las 02:01

2 respuestas

La mejor respuesta

¿Es posible que el sistema operativo Android pueda retrasar o suspender mi asynctask por alguna razón?

Podría estar bloqueado por otra instancia de AsyncTask. De forma predeterminada, se ejecutan en un único hilo de fondo: https://developer.android. com / reference / android / os / AsyncTask.html

Si es así, ¿qué puedo hacer para asegurarme de que mi tarea (por ejemplo, obtener datos de la base de datos) no se retrase ni se suspenda?

Investigue qué causa exactamente el retraso. ¿Es algo dentro del método doInBackground o tal vez ocurre un retraso antes o después de la operación en segundo plano? Puede ser cualquier cosa, difícil de decir sin depurar el código.

Puede ejecutarlo en un hilo de la interfaz de usuario, pero he leído que no es una buena idea, ya que puede congelar la interfaz de usuario y provocar un retraso.

Aunque AsyncTask no es una buena solución en este caso, debería funcionar bien si lo implementa correctamente. Otros enfoques a considerar serán Loader s, o AsyncQueryHandler con ContentProvider. Depende de su caso de uso.

2
Gennadii Saprykin 13 dic. 2016 a las 23:40

@Override protected void onPreExecute () {holdWait = false; detener = falso; }

    @Override
    protected Void doInBackground(Void... params) {
        synchronized (this) {
            while(true) {
                if(Work) return null;
                if(HaveWork) {
                    //make some
                } else {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        return null;
    }

    public void mynotify() {
        synchronized (this) {
            if(holdWait) {
                notify();
                holdWait = false;
            }
        }
    }

    public void setStopWork() {
        synchronized (this) {
            stop= false;
            if(holdWait) {
                notify();
                holdWait = false;
            }
        }
    }
}
0
user1782565 13 dic. 2016 a las 23:47