Wait Firebase async извлекает данные на Android
Мне нужно сохранить результат метода getBalue FireBase, который является асинхронным. Я не могу использовать что-то вроде «onPostExecute ()», и для моей цели я не могу выполнить всю свою операцию «в onDataChange ()», потому что мне нужны ссылки в будущем в других действиях.
Здесь мой fragment для извлечения данных:
List villages = new LinkedList(); Firebase ref = new Firebase("MYFIREBASEURL").child("village"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { spinnerArray.clear(); for (DataSnapshot postSnapshot : snapshot.getChildren()) { Village v = postSnapshot.getValue(Village.class); villages.add(v); } } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println("The read failed: " + firebaseError.getMessage()); } });
Если я пытаюсь читать деревни из «onDataChange», у меня, естественно, для его асинхронной жизни нулевое значение. Есть способ гарантировать, что onDataChange был вызван ?.
- Монитор против Mutex в c #
- Лучший инструмент для синхронизации баз данных MySQL
- Можно ли использовать мьютекс в многопроцессорном случае в Linux / UNIX?
- Как определить, заблокирован ли объект (синхронизирован), чтобы он не блокировался на Java?
- Печать Even and Odd с использованием двух streamов в Java
- Синхронный запрос в Node.js
- В чем разница между синхронизацией на lockObject и использованием этого как блокировки?
- Каковы различия между различными параметрами синхронизации streamов в C #?
- C # версия синхронизированного ключевого слова java?
- Избегайте синхронизации (это) в Java?
- Символические ссылки и синхронизированные папки в Vagrant
- Следует ли синхронизировать метод запуска? Почему или почему нет?
- Синхронизировано ли унаследовано в Java?
Извините, если это не то, что вы хотите, потому что мой английский слишком плохой. Вы можете определить интерфейс прослушивателя для его обработки. Пример:
public interface OnGetDataListener { public void onStart(); public void onSuccess(DataSnapshot data); public void onFailed(DatabaseError databaseError); }
И я создаю пользовательскую функцию для получения данных в Database.class:
public void mReadDataOnce(String child, final OnGetDataListener listener) { listener.onStart(); FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { listener.onSuccess(dataSnapshot); } @Override public void onCancelled(DatabaseError databaseError) { listener.onFailed(databaseError); } }); }
Когда я хочу получить данные из Main.class, я делаю:
private void mCheckInforInServer(String child) { new Database().mReadDataOnce(child, new OnGetDataListener() { @Override public void onStart() { //DO SOME THING WHEN START GET DATA HERE } @Override public void onSuccess(DataSnapshot data) { //DO SOME THING WHEN GET DATA SUCCESS HERE } @Override public void onFailed(DatabaseError databaseError) { //DO SOME THING WHEN GET DATA FAILED HERE } }); }
Таким образом, вы можете повторно использовать свой метод и обрабатывать данные.
Чтобы добавить к ответу onStart()
, можно было бы вызвать onStart()
непосредственно перед
FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
И в onStart()
обычно вы показываете progressDialog:
if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(getContext()); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.setIndeterminate(true); } mProgressDialog.show();
И в onSuccess()
диалог и загрузите данные в графический интерфейс (или что бы вы ни делали)
if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); }
Я понял, что вы пытаетесь сохранить данные моментальных снимков в переменной, но из-за задачи async переменная оказывается пустой, это связано с природой задачи async, что вы можете сделать, это передать данные моментального снимка из прослушивателя Firebase функцию для вашей пользовательской функции снаружи и хранить данные моментальных снимков в глобальной переменной. Затем вы можете использовать переменную так, как хотите.