La aplicación parece dejar de funcionar cuando la pantalla se va a dormir

Tengo una operación de larga duración de la CPU (unas horas) que estoy usando AsyncTask para realizar. A medida que continúa, se actualiza una barra de progreso en la pantalla para mostrar qué porcentaje de la tarea se realiza.

Descubrí que cuando mi pantalla se va a dormir (tiempo de espera) la tarea parece detenerse. No estoy seguro de si esto es happing porque el AsyncTask se detiene o se queda aturando a intentar actualizar la pantalla (esto es lo que estoy pensando).

Aparte de nunca dejar que la pantalla duerma, ¿de qué otra manera puedo evitar que mi AsyncTask deje de ejecutar? Y si esa es la única manera, entonces ¿cómo puedo asegurarme de que la pantalla no duerma?

EDIT : Debo agregar que sé que esto suena como una aplicación no-user-friendly como comentado por alguien a continuación. Esto hace una tarea muy especializada (procesa miles de archivos de imagen para comparar el procesamiento en diferentes sistemas) y debe ser utilizado por algunos usuarios internamente, no para la versión pública.

Ese es el comportamiento esperado. La idea es que la batería del teléfono no se supone que debe drenar debido a las malas aplicaciones. Si la pantalla está apagada, el usuario generalmente espera que el teléfono funcione.

Si necesitas que tu aplicación funcione, puedes usar un WakeLock para mantener el teléfono en funcionamiento (con la pantalla apagada): Documentación aquí y aquí .

Tenga en cuenta que un bloqueo de activación requiere el permiso WAKE_LOCK y, de nuevo, debe dejar claro al usuario que su aplicación tomará el batido del teléfono mientras esté apagado.

No estoy seguro si alguien va a leer esto como el OP es de varios años, pero estoy en el mismo barco en que tengo que usar un wakelock para una aplicación para uso interno, y dejar la pantalla en no estaba bien (sólo necesitaba la CPU Encendido así que podría funcionar algunas preguntas de las métricas) utilicé simplemente un wakelock parcial; es decir:

public class my_frag extends Fragment { WakeLock wl; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setRetainInstance(true); PowerManager pm = (PowerManager) this.getActivity().getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); //I happen to have it in a button click event based on an async task //Side note: I should probably be using a Loader for my Async task but this works fine connectButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (metrics_task != null) { Status s = metrics_task.getStatus(); if (s.name().equals("RUNNING")){ if (metrics_task.running){ metrics_task.cancel(true); connectButton.setText("Start"); metrics_task.running = false; wl.release(); <--releases it on async stop } else{ metrics_task = new start_metrics(ae); metrics_task.execute(); wl.acquire(); <--starts it on async start } } else{ metrics_task = new start_metrics(ae); metrics_task.execute(); } } else{ metrics_task = new start_metrics(ae); metrics_task.execute(); } } }); 

Esto funcionó muy bien sin problemas

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.