¿Es la mejor práctica para las tareas de red repetidas?
Tengo una pequeña aplicación de Android en la que tengo que hacer algunas cosas FTP cada par de segundos. Después de aprender de la manera difícil que ejecutar cosas de red en el hilo de la interfaz de usuario es algo que Android realmente no le gusta, he llegado a esta solución:
// This class gets declared inside my Activity private class CheckFtpTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... dummy) { Thread.currentThread().setName("CheckFtpTask"); // Here I'll do the FTP stuff ftpStuff(); return null; } } // Member variables inside my activity private Handler checkFtpHandler; private Runnable checkFtpRunnable; // I set up the task later in some of my Activitiy's method: checkFtpHandler = new Handler(); checkFtpRunnable = new Runnable() { @Override public void run() { new CheckFtpTask().execute((Void[])null); checkFtpHandler.postDelayed(checkFtpRunnable, 5000); } }; checkFtpRunnable.run();
¿Es esta buena práctica realizar una tarea recurrente que no se puede ejecutar directamente en el subproceso de interfaz de usuario? Además, en lugar de crear un nuevo objeto AsyncTask todo el tiempo llamando
- ¿Cómo probar Volley Library en el estudio de Android?
- La conexión al servidor no tuvo éxito en la brecha telefónica
- Cómo Robolectric trabaja con Volley
- Lambda provoca la excepción del compilador en el módulo de la biblioteca de Android
- Phonegap Cordova 2.0 onActivityResult no se llama
new CheckFtpTask().execute((Void[])null);
¿Sería una opción para crear el objeto CheckFtpTask
una vez y luego reutilizarlo? ¿O eso me dará efectos secundarios?
Gracias de antemano, Jens.
- Uso de recursos de diseño en un papel LiveWallpaper en Android
- Error: Error al encontrar: com.google.guava: guava: 18.0. +
- Voleibol y datos de procesamiento devueltos en segundo plano en Android
- PhoneGap: inicia otra aplicación desde la aplicación actual
- Android MultiDex - Preguntas sobre el funcionamiento interno
- ¿Cómo seleccionar qué botón pulsar sobre Robotium para un diálogo de alerta?
- Cómo hacer la solicitud de correo de jabón utilizando la biblioteca Volley en Android
- Leanback.DetailsFragment no se desplaza como se esperaba
¿Sería una opción para crear el objeto CheckFtpTask una vez y luego reutilizarlo? ¿O eso me dará efectos secundarios?
No, habrá efectos secundarios. Citando los documentos Reglas de subprocesos:
La tarea se puede ejecutar sólo una vez (se producirá una excepción si se intenta una segunda ejecución).
Sólo tendrá que crear una instancia independiente de la tarea cada vez que desee ejecutarla.
Y no estoy seguro de por qué necesita el Runnable
o Handler
. AsyncTask
tiene métodos que se ejecutan en el UI Thread
(todo excepto doInBackground()
, en realidad) si necesita actualizar la UI
.
Compruebe esta respuesta si necesita una devolución de llamada para actualizar la UI
al finalizar la tarea.
Debe crear una nueva tarea Async para cada llamada.
Consulte la documentación de Android: AsyncTask . De acuerdo con esta documentación:
La tarea se puede ejecutar sólo una vez (se producirá una excepción si se intenta una segunda ejecución).
Compruebe específicamente la sección de reglas de subprocesos . Hay una respuesta similar aquí, https://stackoverflow.com/a/18547396/2728623
Java ThreadPools y ExecutorFramework le permiten ejecutar subprocesos según sea necesario y reduce la sobrecarga de creación de subprocesos. Echa un vistazo a singleThreadExecutor . El uso de hilo de la piscina es bastante fácil también!
- La URL no se puede emitir a String
- Cómo pasar los datos correctos a un programa de shader OpenGL-ES 2.0