首页 > 解决方案 > Android Studio:使用firebase数据库查询用户数据需要时间加载

问题描述

我有一个 Firebase 实时数据库,其中包含具有以下结构的用户数据:

AppName
  Users
    User1
      address:
      current_loc:
      dp:
      homeloc:
      loc:
      name:
      phone:
      username: 
    User2
      address:
      current_loc:
      dp:
      homeloc:
      loc:
      name:
      phone:
      username: 

现在,在应用程序中,我使用了一个搜索视图,它接受这样的查询,

public boolean onQueryTextChange(String s) {
                if(s!=null&&!s.isEmpty()&&!s.equals(" ")) {
                    searchQ(s);
                }
                else {
                    resultList.setAdapter(new SearchAdapter(new ArrayList<SearchUsers>()));
                }
                return false;
            }
        });

我将用户数据放在列表中,然后与搜索查询进行比较。这就是我填充列表的方式:

@Override
    protected void onStart(){
        super.onStart();
       if(searchData!=null){
            searchData.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()){
                        list = new ArrayList<>();
                        for(DataSnapshot ds : dataSnapshot.getChildren()){
                            list.add(ds.getValue(SearchUsers.class));
                            SearchAdapter SA = new SearchAdapter(list);
                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(SearchFamily.this,"Error : "+databaseError.getMessage(),Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

SearchQ 方法,

private void searchQ(String str){
        lav.setVisibility(View.INVISIBLE);

        i = getIntent();
        i.getExtras();
        Usern = i.getStringExtra("usr");
        ArrayList<SearchUsers> Susers = new ArrayList<>();
        for(SearchUsers obj:list){
            if(!obj.getUsername().contains(Usern))
            if(obj.getUsername().toLowerCase().contains(str) || obj.getName().toLowerCase().contains(str.toLowerCase()))  {
                Susers.add(obj);
            }
        }
        SearchAdapter newSAdapter = new SearchAdapter(Susers);
        if(newSAdapter.getItemCount()==0){
            lav.setVisibility(View.VISIBLE);
            lav.playAnimation();

        }
        resultList.setAdapter(newSAdapter);
    }

编辑 1: 适配器采用 name、username、loc、dp(profile pic)、homeloc 值。

这个完整的过程需要 2-3 秒来加载。我目前只有 3-4 个用户。有没有最佳的搜索方式?如果用户群增加到 1000+ 左右,有什么更好的解决方案?

标签: javaperformancefirebase-realtime-databaseandroid-recyclerviewsearchview

解决方案


推荐阅读