Tôi thực sự không chắc liệu việc sử dụng setHasStableId
cờ có khắc phục được sự cố của bạn hay không. Dựa trên thông tin bạn cung cấp, vấn đề hiệu suất của bạn có thể liên quan đến sự cố bộ nhớ. Hiệu suất ứng dụng của bạn về giao diện người dùng và bộ nhớ là khá liên quan.
Tuần trước, tôi phát hiện ứng dụng của mình bị rò rỉ bộ nhớ. Tôi phát hiện ra điều này vì sau 20 phút sử dụng ứng dụng của mình, tôi nhận thấy giao diện người dùng hoạt động rất chậm. Việc đóng / mở một hoạt động hoặc cuộn RecyclerView với một loạt các phần tử thực sự rất chậm. Sau khi theo dõi một số người dùng của tôi trong quá trình sản xuất bằng http://flowup.io/, tôi thấy điều này:
Thời gian khung hình thực sự rất cao và khung hình trên giây thực sự rất thấp. Bạn có thể thấy rằng một số khung hình cần khoảng 2 giây để kết xuất: S.
Đang cố gắng tìm ra nguyên nhân gây ra khung hình / khung hình / giây kém này, tôi đã phát hiện ra mình có vấn đề về bộ nhớ như bạn có thể thấy ở đây:
Ngay cả khi mức tiêu thụ bộ nhớ trung bình là gần 15MB cùng lúc ứng dụng đang giảm khung hình.
Đó là cách tôi phát hiện ra vấn đề về giao diện người dùng. Tôi đã bị rò rỉ bộ nhớ trong ứng dụng của mình gây ra rất nhiều sự kiện bộ thu gom rác và điều đó gây ra hiệu suất giao diện người dùng kém vì máy ảo Android phải dừng ứng dụng của tôi để thu thập bộ nhớ mỗi khung hình.
Nhìn vào đoạn mã, tôi đã bị rò rỉ bên trong chế độ xem tùy chỉnh vì tôi không hủy đăng ký người nghe từ phiên bản Android Choreographer. Sau khi phát hành bản sửa lỗi, mọi thứ trở nên bình thường :)
Nếu ứng dụng của bạn bị giảm khung hình do sự cố bộ nhớ, bạn nên xem lại hai lỗi phổ biến:
Xem lại liệu ứng dụng của bạn có đang phân bổ các đối tượng bên trong một phương thức được gọi nhiều lần mỗi giây hay không. Ngay cả khi việc phân bổ này có thể được thực hiện ở một nơi khác, nơi ứng dụng của bạn đang trở nên chậm chạp. Một ví dụ có thể là tạo các phiên bản mới của một đối tượng bên trong phương thức xem tùy chỉnh onDraw trên onBindViewHolder trong trình giữ chế độ xem chế độ xem tái chế của bạn. Xem lại nếu ứng dụng của bạn đang đăng ký một phiên bản vào Android SDK nhưng không phát hành phiên bản đó. Đăng ký một người nghe vào một sự kiện xe buýt cũng có thể bị rò rỉ.
Tuyên bố từ chối trách nhiệm: Công cụ tôi đang sử dụng để giám sát ứng dụng của mình đang được phát triển. Tôi có quyền truy cập vào công cụ này vì tôi là một trong những nhà phát triển :) Nếu bạn muốn truy cập vào công cụ này, chúng tôi sẽ sớm phát hành phiên bản beta! Bạn có thể tham gia vào trang web của chúng tôi: http://flowup.io/ .
Nếu bạn muốn sử dụng các công cụ khác nhau, bạn có thể sử dụng: traveview, dmtracedump, systrace hoặc màn hình hiệu suất Andorid được tích hợp vào Android Studio. Nhưng hãy nhớ rằng công cụ này sẽ giám sát thiết bị được kết nối của bạn chứ không phải phần còn lại của thiết bị người dùng hoặc cài đặt hệ điều hành Android của bạn.