Frage

ich eine Service haben, die AsyncTasks für das Herunterladen von Dateien erstellt. In Aktivitäten schaffen wir Runnables oder Threads 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)?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top