【发布时间】:2020-12-12 19:07:56
【问题描述】:
我使用RecyclerView 在应用程序中通过 Firebase 数据库查看用户通过编辑文本查询的数据。我的问题是。如果数据库中查询的文本过多(例如:1000+),应用程序可能会崩溃。但是,如果查询的文本在数据库中较少(例如:小于100),则没有问题,代码可以正常工作。我想知道为什么会出现这个问题,我正在寻找答案。我已经看到 Logcat 使 CPU 过载的记录。我认为当我想在实践中使用适配器显示数据库的结果时会出现此问题。我尝试使用后台线程,但它不起作用,或者我在错误的地方使用它。如果您提供帮助,我将不胜感激。我应该调查什么并找出我是否可以解决这个问题?对不起我的英语不好。
我的活动:
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);
}
}
用户.java:
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;
}
}
NameViewHolder.java:
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);
}
}
【问题讨论】:
-
可以发
activity_main.xml的内容吗?我很好奇您的 RecyclerView 是否使用wrap_content作为其维度之一。 -
您是否尝试过实现某种分页系统?您可以/应该只在开始时在您的 recyclerView 中显示前 12 个结果。如果用户输入少于 3 个字符,我也会阻止搜索以避免不必要的返回值。
-
如果小于 10 个字符,则阻止查询。我分享了一些代码。我的问题只是性能。当我想列出数据库中的数据时,应用程序可能会崩溃,但如果数据量低,它会运行顺利。
-
您可以尝试将
.limitToFirst(50);添加到您的firebaseSearchQuery中吗?在我看来,你不应该一次在 RecyclerView 中显示超过 20 个项目。 -
非常感谢您的回答。我照你说的做了。起初我限制了数据,然后我使用了分页。非常感谢您的帮助。
标签: java android firebase firebase-realtime-database android-recyclerview