Pergunta

eu tenho um Service isso cria AsyncTasks para baixar arquivos. Nas atividades, criamos Runnables ou Threads que passamos para Activity.runOnUiThread(). Não posso acessar esse método de um serviço, então como uso AsyncTask Corretamente, (faça o trabalho pesado sem bloquear o tópico da interface do usuário)?

Foi útil?

Solução

Se o seu serviço for chamado apenas do seu aplicativo e você poderá fazer um singleton, tente o seguinte:

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();
    }
}

Agora você pode chamar diretamente os métodos em seu serviço. Então, basta ligar downloadFile() para colocar o serviço para funcionar.

Sobre o seu real Pergunta de como atualizar a interface do usuário. Observe que este método recebe um ProgressListener instância. Poderia ficar assim:

public interface ProgressListener {
    void startDownloading();
    void downloadProgress(int progress);
    void endOfDownload();
    void downloadFailed();
}

Agora você apenas atualiza a interface do usuário da atividade (não do serviço, que permanece sem saber como a interface do usuário se parece).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top