Cómo crear / Ejecutar AsyncTask en servicio sin runOnUiThread ()
-
27-09-2019 - |
Pregunta
Tengo un Service
que crea AsyncTask
s para la descarga de archivos. En las actividades, creamos Runnable
s o Thread
s que pasamos a Activity.runOnUiThread()
. No puedo acceder ese método de un servicio, por lo que ¿cómo lo uso AsyncTask
correctamente, (realizar trabajo pesado sin bloquear el hilo de interfaz de usuario)?
Solución
Si su servicio sólo se le llama desde la aplicación, y se puede hacer que sea un producto único, a continuación, intente lo siguiente:
public class FileDownloaderService extends Service implements FileDownloader {
private static FileDownloaderService instance;
public FileDownloaderService () {
if (instance != null) {
throw new IllegalStateException("This service is supposed to be a singleton");
}
}
public static FileDownloaderService getInstance() {
// TODO: Make sure instance is not null!
return instance;
}
@Override
public void onCreate() {
instance = this;
}
@Override
public IBinder onBind(@SuppressWarnings("unused") Intent intent) {
return null;
}
@Override
public void downloadFile(URL from, File to, ProgressListener progressListener) {
new Thread(new Runnable() {
@Override
public void run() {
// Perform the file download
}
}).start();
}
}
Ahora usted puede llamar directamente métodos en su servicio. Por lo que sólo llamar downloadFile()
para poner el servicio de trabajo.
Acerca de su real cuestión de cómo actualizar la interfaz de usuario. Tenga en cuenta que este método recibe una instancia ProgressListener
. Se podría tener este aspecto:
public interface ProgressListener {
void startDownloading();
void downloadProgress(int progress);
void endOfDownload();
void downloadFailed();
}
Ahora que acaba de actualizar la interfaz de usuario de la actividad (no del servicio, que sigue siendo conscientes de cómo las miradas de interfaz de usuario le gusta).