Como criar/executar o AsyncTask em serviço sem Runonuithread ()
-
27-09-2019 - |
Pergunta
eu tenho um Service
isso cria AsyncTask
s para baixar arquivos. Nas atividades, criamos Runnable
s ou Thread
s 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)?
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).