Синхронное выполнение длительных методов в Сервисе - PullRequest
0 голосов
/ 05 марта 2019

У меня есть служба Android с набором операций:

MyService.java

public class MyService extends Service {

    public int login() {
      //Invokes yet another logic to initiate login and waits for result 
      //synchronously and returns status code based on result of operation
    }

    public int logout() {
      //Invokes yet another logic to initiate logout and waits for result 
      //synchronously and returns the status code
    }
}

Я вызываю методы из активности клиента, скажем,MyClientActivity.java, находящихся в одном и том же процессе.

Для каждой операции служба вызывает некоторую логику и синхронно ожидает результат.Когда служба выполняет всю эту логику, я не хочу, чтобы пользователь выполнял что-либо еще и просто отображал экран загрузки.В общем, после того, как я начал операцию, я хочу, чтобы MyClientActivity синхронно ожидал код состояния.Теперь я знаю, что не могу заблокировать поток пользовательского интерфейса, чтобы избежать ANR.
Как я могу заставить эту операцию выполняться в отдельном потоке, а затем получить результат обратно, чтобы я мог соответствующим образом передать результат обратно пользователю, изменив пользовательский интерфейс на основе этого результата.

Я довольноновичок в этом и не может понять концепции.Если кто-то может объяснить вместе с примером, это было бы полезно.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Я выполнил это с помощью HandlerThread для создания Handler, на который я отправляю Runnables для выполнения фоновых задач.
Для выполнения задач основного потока (задач пользовательского интерфейса) я использую mainLooper создать еще один Handler, в который я отправляю Runnables для выполнения операций над представлениями.
Грубое представление кода:

mBackgroundHandler.post(new Runnable() {

    @Override
    public void run() {
        //Do background operation in synchronous manner as usual.

    mMainHandler.post(new Runnable() {
        @Override
        public void run() {
            //Remove loader, update UI
        }
    });
  }
});
0 голосов
/ 05 марта 2019

В Android есть много способов сделать асинхронную работу, как вы описали.Вы можете использовать Сервис , Loader , если вы используете библиотеку Retrofit для сетевых запросов, чем встроенные асинхронные запросы, так что следуйте документации ,Также есть RxJava, но его кривая обучения довольно крутая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...