Держите поток живым, чтобы получить обратный вызов
Я уже использовал обратные вызовы раньше, но только тогда, когда мой клиентский код не отвечал за поддержание работы программы/потоков (например, в приложении для Android). Все, что я хочу сейчас сделать, это сделать действительно простой Firestore Java-клиент, который прослушивает обновления базы данных в реальном времени. Мой код очень прост и дает вам представление о том, что я делаю. хотеть добиться чего-то, но я не знаю как.
Что я уже пробовал:
public class Main { public static void main(String[] args) { DatabaseClient databaseClient = new DatabaseClient(); databaseClient.listenForUpdates(() -> { System.out.println("Alright, new update, gotcha"); }); } }
public class DatabaseClient { private final Firestore firestore = FirestoreClient.getFirestore(); void listenForUpdates(OnUpdateListener listener) { firestore.document("MyDocument").addSnapshotListener((value, error) -> { //Ignore 'value' and 'error' in this example listener.onUpdate(); }); } }
public interface OnUpdateListener { void onUpdate(); }Как и ожидалось, теперь он выполняется
run()
один раз, а потом прекращается. Итак, как я могу поддерживать работу программы, чтобы она могла получать обратный вызов при обновлении базы данных? Я думаю, что мог бы добавить бесконечный цикл, перевести поток в спящий режим и проверить наличие обновлений, но я хотел бы узнать, как сделать эту работу с помощью обратных вызовов.
Gerry Schmitz
Всегда есть "петля" или какое-то время где-то. В Windows это "цикл сообщений". В консольном приложении вы создаете свое собственное. Поскольку асинхронность бессмысленна без "другой работы", которую нужно сделать в то же время, вы делаете ее синхронной с механизмом таймаута.
VanuDiplomat
Спасибо, в этом есть смысл. :)