Android:Firebase花费了太多时间来获取数据

时间:2016-06-08 12:42:34

标签: java android arraylist firebase firebase-realtime-database

我在我的应用程序中使用Firebase的实时数据库功能。数据库看起来像这样: database snap

节点104,1040 ......具有其他元素/数据。我正在获取这些数据,并按节点排序,并在“更新过程”中对其进行排序。在每个Integer父级中都可用,如snap中所示。我正在使用onChildAddedListener()来获取最后20个元素。 '结果'中有大约1050个节点。

问题:

  1. 即使在高速WiFi上,获取数据也需要30秒左右的时间。

  2. Firebase是否允许任何回调通知已提取数据?我想将每个自定义对象附加到从Firebase收到的ArrayList,并将其通过意图传递给另一个活动。我正在计算收到的对象,当它变为20时,我打开了我的活动。这是唯一的方法吗?如果有更好的出路,请建议。

  3. 这是我的代码:

     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);
            }
    

1 个答案:

答案 0 :(得分:0)

在添加值侦听器之前尝试重新连接到firebase:

private void fetchNews(Query queryNewsReference) 
{    
    if (FirebaseDatabase.getInstance() != null)
    {
        FirebaseDatabase.getInstance().goOffline();
    }

    FirebaseDatabase.getInstance().goOnline();

    queryNewsReference.addChildEventListener(new ChildEventListener() {

    ...
}