Nano Hash - криптовалюты, майнинг, программирование

Отправка значений прогресса из службы в активность в Android с помощью Binder

У меня есть служба, загружающая некоторые данные, и я хочу отправить значения прогресса активности, связанной с этой службой.

Я знаю доступные решения для подобных проблем: AsyncTask, Messenger и Bounding Activity to a service. Я хочу реализовать его, используя ограниченный сервисный подход.

Все примеры, которые я нашел, создают общедоступный метод в службе и вызывают метод из класса активности после привязки его к службе, но я думаю, что в моей ситуации для получения частых значений обновления потребуется бесконечный цикл. Есть ли какой-либо подход к тому, чтобы служба отправляла данные в активность и как-то обновляла пользовательский интерфейс при изменении значения прогресса? (Без использования Messenger или AsycTask)

Заранее спасибо.


  • Непонятно, почему бы вам просто не использовать технику связывания. 01.10.2013
  • Я использую технику связывания. Но образцы, которые я нашел, делают метод вызова активности в сервисе. это не будет эффективно для получения обновлений от службы, потому что мне потребуется часто проверять активность. 01.10.2013

Ответы:


1

Вы можете определить обратный вызов в другом AIDL.

package ...;
interface XService {
    ...
    void startX(String path, XServiceCallback callback);
}

и в другом вспомогательном файле:

package ...;
interface XServiceCallback {
    void xReady(int errCode, String text);
}

Но обратный вызов будет вызываться асинхронно, поэтому вам придется использовать Handler.post(Runnable).

Альтернативой является использование Runnable, который повторно публикует себя (через postDelayed()) в потоке пользовательского интерфейса и опрашивает ход выполнения, скажем, каждые 0,2 секунды.

В обоих случаях вам придется помнить, что сервис или клиент могут умереть.

Что касается кода, то берешь какой-нибудь пример удаленного сервиса (их много в нете) и добавляешь в клиентскую часть что-то вроде этого:

XServiceCallback mServiceCallback = new XServiceCallback.Stub() {
    @Override
    public void xReady(final int errCode, final String text) throws RemoteException {
        handler.post(new Runnable() {
            @Override
            public void run() {
            // use the result
            }
        });
    }
};

Ваш клиент передает этот обратный вызов службе, служба вызывает его, вызывается ваш метод на стороне клиента.

01.10.2013
  • Есть ли другой более простой способ использования только класса Binder и объекта Connection в действии? 01.10.2013
  • Что инициирует обновление пользовательского интерфейса? Если это служба, вы получаете обратный вызов или Messenger (это сводится к другому стилю обратного вызова). Если это клиент, вы получаете своего рода опрос. Как клиент узнает, что операция завершена? Опять же, это либо обратный вызов, либо опрос. 02.10.2013
  • как сделать этот обратный вызов без использования Messenger? 02.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..