【问题标题】:How can I improve the performance of RecyclerView and Firebase search?如何提高 RecyclerView 和 Firebase 搜索的性能?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多