Pregunta

Tengo un Service que crea AsyncTasks para la descarga de archivos. En las actividades, creamos Runnables o Threads 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)?

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top