Comment faire pour créer / Exécuter AsyncTask Service sans runOnUiThread ()
-
27-09-2019 - |
Question
J'ai un Service
qui crée AsyncTask
s pour le téléchargement de fichiers. Dans les activités, nous créons Runnable
s ou Thread
s que nous passons à Activity.runOnUiThread()
. Je ne peux pas accéder cette méthode d'un service, alors comment puis-je utiliser AsyncTask
correctement, (travaux lourds sans bloquer l'interface utilisateur fil)?
La solution
Si votre service est seulement appelé à partir de votre application, et vous pouvez en faire un singleton, essayez ceci:
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();
}
}
Maintenant, vous pouvez appeler directement les méthodes sur votre service. Donc, il suffit d'appeler downloadFile()
pour mettre le service au travail.
A propos de votre real question de savoir comment mettre à jour l'interface utilisateur. Notez que cette méthode reçoit une instance de ProgressListener
. Il pourrait ressembler à ceci:
public interface ProgressListener {
void startDownloading();
void downloadProgress(int progress);
void endOfDownload();
void downloadFailed();
}
Maintenant, vous mettez à jour juste l'interface utilisateur de l'activité (pas de service, qui ne connaît toujours pas la façon dont l'apparence de l'interface utilisateur aiment).