Tối ưu hóa RecyclerView – Tăng hiệu suất Scrolling

Tram Ho

Giới thiệu

Chào các bạn, đến hẹn lại lên thì cần phải research một cái gì đó. Thế hôm nay hãy cùng mình tìm hiểu về RecyclerView nhé.
Cái này chắc các cụ Android dev biết hết rồi nhỉ, vậy thử cùng nhau tối ưu hóa nó nhé!

Khi chúng ta triển khai RecyclerView trong Ứng dụng Android của mình, đôi khi, chúng ta gặp phải các vấn đề như:
Các item RecyclerView scroll không trơn tru. Điều này dẫn đến trải nghiệm người dùng không tốt vì có vẻ như Ứng dụng Android của chúng ta bị lag.

Hãy xem những điều chúng ta có thể làm để cải thiện hiệu suất của RecyclerView và chúng tôi sẽ scroll mượt mà hơn.

Nguồn: https://blog.mindorks.com/recyclerview-optimization

Kỹ thuật tối ưu hóa RecyclerView

Sử dụng Image-Loading Library

Khi Garbage Collection (GC) chạy trên main thread, một trong những lý do khiến UI unresponsive là việc phân bổ và phân bổ bộ nhớ liên tục, dẫn đến việc chạy GC rất thường xuyên. Bằng cách sử dụng khái niệm bitmap pool, chúng ta có thể tránh nó.

Tốt nhất là dùng các thư viện Image-Loading như Glide, Fresco sử dụng khái niệm bitmap pool này. Vì vậy, hãy luôn sử dụng các thư viện Image-Loading.
Ủy quyền tất cả các tác vụ liên quan đến hình ảnh cho các thư viện này.

Set Image Width and Height

Nếu chiều rộng và chiều cao hình ảnh của chúng ta là động (không cố định) và chúng ta đang nhận được imageUrl từ máy chủ.

Nếu chúng ta không đặt chiều rộng và chiều cao hình ảnh chính xác trước đó, UI sẽ nhấp nháy trong quá trình tải xuống hình ảnh và cài đặt hình ảnh vào ImageView (thực sự hiển thị hình ảnh khi tải xuống hoàn tất).

Vì vậy, chúng ta nên yêu cầu backend developer của chúng ta gửi kích thước hình ảnh hoặc tỷ lệ co, theo đó, chúng ta có thể tính toán chiều rộng và chiều cao cần thiết của ImageView.

Sau đó, chúng tôi sẽ chỉ có thể đặt trước chiều rộng và chiều cao. Do đó không nhấp nháy. Vấn đề đã được giải quyết!

Làm ít hơn trong method onBindViewHolder

Phương thức onBindViewHolder của chúng ta nên thực hiện ít công việc hơn. Chúng ta nên kiểm tra phương thức onBindViewHolder của mình và tối ưu hóa nó. Chúng tôi có thể thấy sự cải thiện trong RecyclerView của mình bằng cách làm như vậy.

dùng Notify Item RecyclerView API

Bất cứ khi nào chúng ta có trường hợp sử dụng của việc xóa, cập nhật, bổ sung item, hãy sử dụng API notify item.

Ngoài ra, hãy kiểm tra DiffUtil.

Trong trường hợp, chúng tôi buộc phải sử dụng InformDataSetChanged () dựa trên trường hợp sử dụng của chúng tôi, chúng tôi có thể thử setHasStableIds (true).

Nó cho biết liệu mỗi mục trong tập dữ liệu có thể được đại diện bằng một mã định danh duy nhất của loại Long hay không.

Ngay cả khi chúng ta gọi hàm notifyDataSetChanged(), nó không phải xử lý việc sắp xếp lại toàn bộ bộ điều hợp vì nó có thể tìm xem mục ở vị trí có giống như trước hay không và thực hiện ít công việc hơn.

Tránh nested view

Nếu có thể, chúng ta nên tránh nested view và cố gắng tạo flat view ở bất cứ đâu có thể. Nested làm giảm hiệu suất RecyclerView. flat view cải thiện hiệu suất.

Dùng setHasFixedSize

Chúng ta nên sử dụng phương pháp này nếu chiều cao của tất cả item bằng nhau. Thêm bên dưới và kiểm tra hiệu suất.

Dùng set RecycledViewPool tối ưu Nested RecyclerView

Như chúng ta biết rằng RecyclerView hoạt động trên nguyên tắc “Tái sử dụng view bằng cách sử dụng pool” nếu có thể.

Nếu chúng ta có use-case của Nested RecyclerView.

Nhưng theo mặc định, việc tối ưu hóa hoạt động cho RecyclerView cụ thể đó vì RecyclerView cụ thể đó có View Pool riêng.

Pool không được chia sẻ giữa hai RecyclerView có cùng view.

Vì vậy, những gì chúng ta có thể làm là chúng ta có thể tạo một ViewPool duy nhất và chuyển nó đến tất cả các RecyclerView bên trong để nó được chia sẻ như dưới đây:

Điều này sẽ cải thiện hiệu suất scroll vì nó sẽ bắt đầu sử dụng lại view từ ViewPool được chia sẻ.

Use setItemViewCacheSize

Chúng tôi có thể thử nghiệm bằng cách đặt Kích thước bộ nhớ cache của ItemView.

Theo tài liệu chính thức: Nó đặt số lượng view ngoài màn hình cần giữ lại trước khi thêm chúng vào recycled view pool được chia sẻ tiềm năng. Bộ nhớ cache của offscreen view luôn nhận biết được các thay đổi trong attached adapter, cho phép LayoutManager sử dụng lại các view chưa được sửa đổi mà không cần quay lại adapter để rebind chúng.

Có nghĩa là khi chúng ta scroll RecyclerView sao cho có một view gần như không hoàn toàn ngoài màn hình, RecyclerView sẽ giữ nó xung quanh để chúng ta có thể cuộn nó trở lại view mà không cần phải gọi lại onBindViewHolder ().

Nói chung, chúng ta không thay đổi kích thước của View Cache, nhưng hãy thử nghiệm với nó, nếu nó phù hợp với bạn, hãy triển khai nó.

Đây là những điều chúng tôi có thể làm để cải thiện hiệu suất của RecyclerView. Đó là nó cho bây giờ.

Kết luận

Cảm ơn các bạn đã theo dõi đến đây. Chúc các bạn tối ưu hóa tốt RecycledView của các bạn nhé
Nếu mình còn thiếu sót điều gì rất hoan nghênh các bạn comment bên dưới cho mình biết ạ!
Chúc các bạn một ngày vui vẻ

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo