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