Question

J'ai un Service qui crée AsyncTasks pour le téléchargement de fichiers. Dans les activités, nous créons Runnables ou Threads 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)?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top