Wie Erstellen / Ausführen AsyncTask in Service ohne runOnUiThread ()
-
27-09-2019 - |
Frage
ich eine Service
haben, die AsyncTask
s für das Herunterladen von Dateien erstellt. In Aktivitäten schaffen wir Runnable
s oder Thread
s dass wir Activity.runOnUiThread()
passieren. Ich kann nicht den Zugang, dass Verfahren von einem Dienst, so wie verwende ich AsyncTask
richtig, (schwere Arbeit tun, ohne den UI-Thread zu blockieren)?
Lösung
Wenn Ihr Dienst nur aus Ihrer Anwendung aufgerufen wird, und Sie können es einen Singleton machen, dann versuchen Sie dies:
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();
}
}
Jetzt können Sie direkt Methoden auf Ihrem Dienst anrufen. Also nur downloadFile()
rufen Sie den Service an der Arbeit zu setzen.
über Ihre real Frage, wie die Benutzeroberfläche zu aktualisieren. Beachten Sie, dass diese Methode eine ProgressListener
Instanz empfängt. Es könnte wie folgt aussehen:
public interface ProgressListener {
void startDownloading();
void downloadProgress(int progress);
void endOfDownload();
void downloadFailed();
}
Jetzt aktualisieren Sie nur die Benutzeroberfläche aus der Aktivität (nicht aus dem Dienst, der nicht bewusst bleibt, wie die Benutzeroberfläche aussieht wie).