有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在应用程序中使用Firebase的实时数据库功能。数据库如下所示: database snap

节点1041040。。。有更多的元素/数据。我在每个整数父级中可用的节点“updatedAt”上按值对数据进行排序,如快照中所示。我正在使用onChildAddedListener()获取最后20个元素。“结果”中大约有1050个节点

问题是:

  1. 即使在高速WiFi上,获取数据也需要花费太多时间,大约30秒

  2. Firebase是否允许任何回调来通知已获取数据?我想将每个自定义对象附加到从Firebase接收的ArrayList中,并通过intent将其传递给另一个活动。我正在数收到的物品,当它变成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);
        }

共 (1) 个答案

  1. # 1 楼答案

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

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