5 sai lầm hay mắc phải khi sử dụng Architecture Components

Tram Ho

Hẳn là bộ thư viện Android Architecture Components đã không còn quá xa lạ với các Android Developer phải k nào?? Với những người mới tìm hiểu thì mình k nói nhưng thậm chí với 1 số các cao thủ thì có lẽ vẫn sẽ mắc phải 1 số sai lầm khi sử dụng Android Architecture Components. Mình tin chắc là vậy ?)). Hoặc là nếu chưa từng mắc phải thì trong bài viết này mình cũng xin nêu ra 5 sai lầm phổ biến mà ta hay gặp phải khi sử dụng Architecture Components.

1. Leaking LiveData observers trong Fragment

Vì Fragment có riêng 1 lifecycle cho riêng nó, thậm chí ngay cả khi Fragment bị detached và re-attached thì vẫn có thể là nó k bị destroy, ví dụ như trường hợp retained Fragment sẽ không bị destroy khi cấu hình thay đổi. Điều này có nghĩa là khi ta observing LiveData trong onCreateView() hay trong các callback sau đó (thường là onActivityCreated()) và pass Fragment như là LivecycleOwner như ví dụ

Đoạn code trên cho thấy sẽ luôn tạo ra Observer khi Fragment re-attached. Tuy nhiên LiveData sẽ k remove observer cũ vì LifecycleOwner (ở đây là Fragment) k bị destroy. Vậy để giải quyết vấn đề này ta sẽ sử dụng getViewLifecycleOwner() hoặc getViewLifecycleOwnerLiveData() thay vì truyền trực tiếp Fragment instance.

2. Reloading data after every rotation

Thông thường ta hay đặt các xử lí logic trong onCreate() – đối với Activity, onCreateView – đối vs Fragment. Điều này tưởng chừng như đúng trong mọi trường hợp nhưng nếu ta để ý thì việc này sẽ k thực sự hiệu quả khi sử dụng cùng vs ViewModel. Bởi mỗi khi ta rotate màn hình thì activity hay fragment sẽ tạo lại, mà thằng ViewModel lại có cơ chế k bị destroy khi rotate. Chính vì thế việc đặt các logic trong trường hợp này có thể gây thừa (vì lại phải load lại data cũ). Để xử lí việc này đơn giản là ta chỉ cần đặt các logic load dữ liệu trong lúc khởi tạo ViewModel hoặc là chỉ load data khi thực hiện 1 hành động cụ thể nào đó. Như ví dụ dưới đây:

3. Leaking ViewModel

Như ta đã biết thì không nên pass View reference vào ViewModel. Tuy nhiên ta cũng không nên pass ViewModel reference vào các class khác. Ví dụ như trường hợp dưới đây:

Ở đây Repository được khai báo là Singleton và ta truyền listener vào Repository trong ViewModel nhưng lại k clear nó sau khi sử dụng xong. Để xử lí vấn đề này ta có thể làm như sau:

4. Exposing LiveData as mutable to views

Có nghĩa là Views-Fragment hay Activity không nên tự update LiveData mà hãy để ViewModel xử lí việc này. ?)) Nhiệm vụ của View-Fragment hay Activity chỉ là observe LiveData mà thôi. Ví dụ:

5. Creating ViewModel’s dependencies after every configuration change

Vì ViewModel tồn tại trong các trường hợp configuration change, vì thế mà việc tạo dependencies mỗi lần cấu hình thay đổi như vậy là thừa, thậm chí có thể gây ra sự cố ngoài ý muốn. Đặc biệt là khi ta để các xử lí logic trong dependencies trong constructor. Ta thử xem qua ví dụ dưới đây:

Mỗi lần cấu hình thay đổi thì ta sẽ tạo 1 instance mới của ViewModelFactory vì thế mà ta không cần phải tạo ra instance mới của tất cả dependecies (ViewModelFactory có thể làm việc này).
Giải pháp ở đây là ta sẽ hoãn tạo dependencies cho đến khi hàm create() được gọi, bởi vì nó chỉ được gọi trong vòng đời của Activity hay Fragment.

Kết luận

Vậy là mình đã đưa ra cho các bạn 1 vài sai lầm hay gặp khi sử dụng Architecture Components. Mong rằng bài viết của mình sẽ hữu ích 1 chút đối vs các bạn ?). Nếu các bạn thấy có gì chưa hiểu hay không hợp lí thì hãy comment để đóng góp cho mình và mọi người khác nhé!! Thanks for reading ?))

Nguồn tham khảo: Link đây nhé!

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo