Как создать / запустить AsyncTask в службе без runOnUiThread () - PullRequest
3 голосов
/ 12 августа 2010

У меня есть Service, который создает AsyncTask с для загрузки файлов.В действиях мы создаем Runnable s или Thread s, которые мы передаем Activity.runOnUiThread().Я не могу получить доступ к этому методу из службы, так как мне правильно использовать AsyncTask (выполнять тяжелую работу без блокировки потока пользовательского интерфейса)?

1 Ответ

2 голосов
/ 05 октября 2010

Если ваш сервис вызывается только из вашего приложения, и вы можете сделать его одноразовым, попробуйте следующее:

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();
    }
}

Теперь вы можете напрямую вызывать методы вашего сервиса. Так что просто позвоните downloadFile(), чтобы запустить службу.

О вашем реальном вопросе о том, как обновить пользовательский интерфейс. Обратите внимание, что этот метод получает экземпляр ProgressListener. Это может выглядеть так:

public interface ProgressListener {
    void startDownloading();
    void downloadProgress(int progress);
    void endOfDownload();
    void downloadFailed();
}

Теперь вы просто обновляете пользовательский интерфейс из активности (а не из службы, которая не знает, как выглядит пользовательский интерфейс).

...