Java 如何提高RecyclerView和Firebase搜索的性能?

Java 如何提高RecyclerView和Firebase搜索的性能?,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我使用RecyclerView在应用程序中查看用户通过Firebase数据库通过edittext查询的数据。我的问题是。如果查询的文本在数据库中太多(例如:1000+),应用程序可能会崩溃。但是,如果查询的文本在数据库中较少(例如:少于100),则没有问题,代码工作正常。我想知道为什么这是一个问题,我正在寻找答案。我看到记录显示Logcat使CPU过载。我认为当我想在实践中使用适配器显示来自数据库的结果时,就会出现这个问题。我试着使用背景线程,但它不起作用,或者我用错了地方。如果你能帮忙,我将不

我使用
RecyclerView
在应用程序中查看用户通过Firebase数据库通过edittext查询的数据。我的问题是。如果查询的文本在数据库中太多(例如:1000+),应用程序可能会崩溃。但是,如果查询的文本在数据库中较少(例如:少于100),则没有问题,代码工作正常。我想知道为什么这是一个问题,我正在寻找答案。我看到记录显示Logcat使CPU过载。我认为当我想在实践中使用适配器显示来自数据库的结果时,就会出现这个问题。我试着使用背景线程,但它不起作用,或者我用错了地方。如果你能帮忙,我将不胜感激。如果我能解决这个问题,我应该调查什么?对不起,我的英语不好

我的活动:

NameViewHolder.java:

如果查询的文本在数据库中太多(例如1000+)

一次获得1000多个对象几乎是不可能的。除此之外,没有用户会进行交互这一事实,在我看来,所有这些对象都是对带宽、资源和金钱的浪费。如果您在对象中存储了大量数据,您还将获得一个

因此,在本例中,最佳实践是减少在单个查询中获得的对象数。正如其他开发人员推荐的那样,您应该以较小的数据块获取数据。这种做法叫做StackOverflow,之前在StackOverflow上已经讨论过很多次了。
我建议您看看其中的一些问题并试一试;)

你能发布
活动_main.xml
的内容吗?我很好奇你的RecyclerView是否使用了
wrap\u content
作为它的一个维度。你试过实现某种分页系统吗?您可以/应该只在开始时在您的recyclerView中显示前12个结果。如果用户输入少于3个字符,我也会阻止搜索,以避免不必要的返回值。如果少于10个字符,则会阻止查询。我分享了一些代码。我的问题只是性能。当我想列出数据库中的数据时,应用程序可能会崩溃,但如果数据较低,则运行平稳到您的
firebaseSearchQuery
?在我看来,你不应该一次在你的回收视图中显示超过20个项目。非常感谢你的回答。我照你说的做了。首先我限制了数据,然后我使用了分页。我真的很感谢你的帮助。
public class MainActivity extends AppCompatActivity {

 DatabaseReference mUserDatabase;
    FirebaseRecyclerOptions<User> options;
    FirebaseRecyclerAdapter<User, NameViewHolder> adapter;
    Query firebaseSearchQuery;
    RecyclerView Search_Contact_List;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mUserDatabase = FirebaseDatabase.getInstance().getReference().child("MyDatabase");

Search_Contact_List = (RecyclerView) findViewById(R.id.Search_Contact_List);
        Search_Contact_List.setHasFixedSize(true);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(getBaseContext(),1);
        Search_Contact_List.setLayoutManager(gridLayoutManager);

firebaseUserSearch(searchText);
}

private void firebaseUserSearch(String searchText) {

        firebaseSearchQuery = mUserDatabase.orderByChild("phone").startAt(searchText).endAt(searchText + "\uf8ff");

        options = new FirebaseRecyclerOptions.Builder<User>()
                .setQuery(firebaseSearchQuery,User.class)
                .build();

        adapter = new FirebaseRecyclerAdapter<User, NameViewHolder>(options) {

            @Override
            protected void onBindViewHolder(@NonNull final NameViewHolder holder, int position, @NonNull final User model) {

                holder.result_name.setText(model.getName());
            }

            @NonNull
            @Override
            public NameViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

                View itemView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.list_layout,parent,false);
                return new NameViewHolder(itemView);
            }

        };
    setCategory() ;
    }

private void setCategory() {

        adapter.startListening();
        Search_Contact_List.setAdapter(adapter);
    }
}
public class User {

    public String name;
    public String phone;

    public User() {

    }

    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}
public class NameViewHolder extends RecyclerView.ViewHolder {

    public TextView result_name;

    public NameViewHolder(View itemView) {
        super(itemView);

        result_name = (TextView)itemView.findViewById(R.id.Search_Result_Name);
    }

}