Как создать / запустить асинктюз в обслуживании без родонограммы ()
-
27-09-2019 - |
Вопрос
у меня есть Service
Это создает AsyncTask
s для загрузки файлов. В мероприятиях мы создаем Runnable
или Thread
с того, что мы переходим к Activity.runOnUiThread()
. Отказ Я не могу получить доступ к этому методу от сервиса, так как я использую AsyncTask
Правильно, (делать тяжелую работу, не блокируя нить UI)?
Решение
Если ваш сервис вызывается только из вашего приложения, и вы можете сделать его Singleton, затем попробуйте это:
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();
}
Теперь вы просто обновите UI из активности (не от службы, которые остаются не знать, как выглядит пользовательский интерфейс).