Я использую функцию базы данных Firebase в реальном времени в своем приложении. База данных выглядит так:
Узлы 104, 1040... имеют дополнительные элементы/данные. Я извлекаю эти данные, упорядочивая их по значению в узле «updatedAt», доступном в каждом родительском элементе Integer, как показано на снимке. Я использую onChildAddedListener()
для получения последних 20 элементов. В «результатах» около 1050 узлов.
Проблема:
Извлечение данных занимает слишком много времени, около 30 секунд, даже при высокоскоростном Wi-Fi.
Разрешает ли Firebase какой-либо обратный вызов для уведомления о том, что данные были получены? Я хочу добавить каждый пользовательский объект в
ArrayList
, полученный от Firebase, и передать его через намерение другому действию. Я считаю полученные объекты, и когда их становится 20, я открываю свою активность. Это единственный способ сделать это? Если есть лучший выход, предлагайте.
Вот мой код:
public class Splash extends AppCompatActivity{
private static final String TAG = "Splash Activity";
private ArrayList<News> NewsArrayList = new ArrayList<>();
private DatabaseReference newsReference;
private int position = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
newsReference = FirebaseDatabase.getInstance().getReference().child("results");
Query queryNewsReference = newsReference.orderByChild("updatedAt").limitToLast(20);
fetchNews(queryNewsReference);
}
private void fetchNews(Query queryNewsReference) {
queryNewsReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
News newsObject = dataSnapshot.getValue(News.class);
Log.d(TAG,"News Title: "+ newsObject.getVideo_title());
NewsArrayList.add(newsObject);
position++;
if(position == 20){
startMainActivity();
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s){
Log.d(TAG, "onChildChanged() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d(TAG, "onChildRemoved() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildMoved() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG,"Database Error: "+databaseError.toString());
}
});
}
private void startMainActivity() {
Intent intent = new Intent(Splash.this,MainActivity.class);
intent.putExtra("NewsList",NewsArrayList);
Splash.this.startActivity(intent);
}