Можете ли вы передать обработчик на службу?
Сначала определите ваш обработчик как интерфейс. Это пример, так что ваш может быть более сложным.
public interface ServerResponseHandler {
public void success(Message[] msgs); // msgs may be null if no new messages
public void error();
}
Определите экземпляр вашего обработчика в вашей деятельности. Поскольку это интерфейс, вы предоставите реализацию здесь в упражнении, поэтому вы можете ссылаться на поля и методы вложенного действия из обработчика.
public class YourActivity extends Activity {
// ... class implementation here ...
updateUI() {
// TODO: UI update work here
}
ServerResponseHandler callback = new ServerResponseHandler() {
@Override
public void success(Message[] msgs) {
// TODO: update UI with messages from msgs[]
YourActivity.this.updateUI();
}
@Override
public void error() {
// TODO: show error dialog here? (or handle error differently)
}
}
void onCheckForMessages() {
networkService.checkForMessages(callback);
}
и NetworkService будет содержать что-то вроде:
void checkForMessages(ServerResponseHandler callback) {
// TODO: contact server, check for new messages here
// call back to UI
if (successful) {
callback.success(msgs);
} else {
callback.error();
}
}
Кроме того, как говорит Aleadam, вы также должны знать, что служба по умолчанию работает в том же потоке. Это часто не предпочтительное поведение для чего-то вроде работы в сети. Страница Основы Android на Сервисах явно предупреждает о работе сети без отдельных потоков:
Внимание. Служба запускается в главном потоке процесса хостинга - служба не
создать свой собственный поток и не запускается в отдельном процессе (если вы не укажете
иначе). Это означает, что если ваш сервис будет выполнять какую-либо интенсивную работу процессора или
блокируя операции (такие как воспроизведение MP3 или работа в сети), вы должны создать новый поток
в службе, чтобы сделать эту работу. Используя отдельный поток, вы уменьшите
риск ошибок приложения не отвечает (ANR), и основной поток приложения может оставаться выделенным для взаимодействия пользователя с вашими действиями.
Для получения дополнительной информации об использовании потоков в вашем сервисе, ознакомьтесь со статьями SO Потоки приложений против потоков сервисов и Как запустить сервис в новом потоке в android