Как справиться с беспорядком асинхронных операций?

#java #android

Вопрос:

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

Какие встроенные классы обеспечивают подобную функциональность? Существующий код (довольно старый) использует AsyncTask, но каждый вызов в нем блокируется. Это работает, но многие из этих блокирующих API устарели, и я не вижу никакого способа заставить AsyncTask делать то, что я хочу, и продолжать работать до конца doInBackground . (Плюс да, сама AsyncTask устарела.)

Примерно так выглядит старый код:

 public class StartupTask extends AsyncTask<Void, Void, Void> implements TaskInterface {

    protected Void doInBackground(Void... params) {

        // several steps here

        String token = FirebaseInstanceId.getInstance().getToken();
        subscribeToAllChannels(token);

        // several more steps, including using token

    }
 

Этот способ получения токена сейчас устарел; Я должен вызвать метод для получения токена, который позже вызовет блок доставки. Это действительно упрощенный пример: фактический код намного сложнее и включает в себя множество асинхронных операций, и я не контролирую многие методы, которые он вызывает.

Новый код должен был бы выглядеть примерно так (это просто psuedocode):

 protected void start() {
    getToken(new Runnable(){
        @override void onResult(String token){
            somethingElse(token, new Runnable(){
                // etc, more levels, until ultimately:
                finished();
            });
        }
    });
}
 

Что-то легче читать будет еще лучше, как я думаю, кто-то думал об этом больше, чем я, но я был бы доволен этот базовый чехол: что-то немного как iOS NSOperation в параллельном режиме, где вместо реализации основных/doInBackground/я реализовать метод start и позже явным образом завершить задачу.

Каковы инструменты для этого на Android/Java? Каждый класс , на который я смотрел, делает одно и то же предположение: задача завершена, когда doInBackground() (или run() , или что-то еще) завершено. Я не нашел никакого способа оставить его висеть и завершить его в ответ на завершение.

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

Комментарии:

1. What structure should I use for this? я думаю, что это делает ваш вопрос основанным на мнении, так как мы не можем сказать вам, что вы должны использовать. если бы вы использовали kotlin, вы могли бы рассмотреть сопрограммы, в противном случае для java, возможно, помогла бы rxjava ?

2. Возможно, справедливо, я полагаю, но на самом деле я просто ищу указатель на то, какие встроенные классы справляются с этим. Я не собираюсь использовать здесь огромные рамки. 🙂 До сих пор я не нашел много информации о том, «как мне/какие классы» помогают онлайн-программированию на Android.

3. AsyncTask является устаревшим, что означает, что есть лучший/более простой способ сделать это. я, вероятно, вижу, что rxjava делает вас немного счастливее благодаря стилю написанного вами кода, но я бы не сказал, что это самый простой фреймворк для изучения, но это основано на моем мнении, которое немного тематично 🙂

4. Да, я не думаю, что мне нужна RxJava. Я, вероятно, мог бы решить эту проблему с помощью цикла while в конце выполнения() (и использования Runnable вместо AsyncTask) и некоторой сигнализации, но это кажется ужасным подходом в производственном коде с точки зрения чистоты.