#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) и некоторой сигнализации, но это кажется ужасным подходом в производственном коде с точки зрения чистоты.