Android - Architecture Components: ViewModel
Bài đăng này đã không được cập nhật trong 5 năm
I. Giới thiệu
Như bạn đã biết ViewModel rất hữu ích khi bạn muốn cung cấp và quản lý dữ liệu cho UI như Activity hay Fragment. Trong bài viết này, chúng ta cùng tìm hiểu cách implement ViewModel trong project.
Hãy giả sử bạn có một vài Activity. Chắc rằng bạn cũng có một số class để lưu trữ vào cung cấp dữ liệu cho UI, chúng ta có thể biết đến như Presenter trong MVP hay ViewModel trong MVVM. Nhưng thật không may, người dùng xoay điện thoại của họ.
Sau đó thì điều gì sẽ xảy ra? Activity của bạn sẽ được khởi tạo lại,và nó sẽ là người giữ lại dư liệu cho UI của bạn. Điều đó có nghĩa là?
- Bạn cần nhớ về việc truyền dữ liệu và activity được khởi tạo lại, nếu không bạn sẽ phải khôi phục dữ liệu đó một lần nữa như là gửi yêu cầu get dữ liệu từ database hoặc từ API một lần nữa
- Bạn phải biết gây ra "memmory leaks" có thế xảy ra vì UI data giữ lâu hơn activity và bạn thì không muốn điều đó
Những giải pháp cho những vấn đề trên là một ViewModel
II. ViewModel
View Model lưu trữ dữ liệu cho UI của bạn và nó nhận biết vòng đời. Điều đó có nghĩa là
ViewModel có thể sống qua các thay đổi cấu hình. Điều đó có nghĩa là ngay cả sau khi activity bị hủy và được tạo lại sau khi xoay điện thoại, bạn sẽ vẫn có cùng ViewModel với cùng một dữ liệu. Do đó mà:
- Bạn không cần lo lắng về vòng đời giữ UI data. ViewModel sẽ được tạo tự động và sẽ được tự hủy mà bạn không phải lo lắng về xử lý nó
- Dư liệu sẽ luôn được cập nhật. Bạn sẽ vẫn nhân được dữ liệu như cũ khi bạn xoay ngang điện thoại mà bạn không cần phải request database hay là API
- Dư liệu sẽ chờ bạn. Nếu bạn thực hiện call API, bạn sẽ xoay điện thoại và kết quả sẽ được gửi trước khi activity được khởi tạo lại, chắc chắn sẽ có dữ liệu trong ViewModel và có thể nhận được khi activity khởi tạo xong
III. Sử dụng ViewModel
Để sử dụng viewmodel bạn cần thêm dependencies và app/build.gradle file
implementation "android.arch.lifecycle:extensions:1.0.0"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0"
Bây giờ bạn có thể sử dụng ViewModel hết sức đơn giản. Cùng xem ví dụ dưới đây:\
public class UsersViewModel extends ViewModel {
private List<User> userList;
public List<User> getUserList() {
if (userList == null) {
usersList = loadUsers();
}
return userList;
}
private List<User> loadUsers() {
// do something to load users
}
}
Giờ chúng ta cần có dữ liệu cho UI, Trong trường hợp này, là danh sách user, load từ external source. Giờ chúng ta có thể sử dụng ViewModel trong Activity
public class UsersActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsersViewModel usersViewModel =
ViewModelProviders.of(this).get(UsersViewModel.class);
showUsers(usersViewModel.getUserList());
}
}
Để có được VirewModel chúng ta sử dụng ViewModelProviders.of()
nhờ đó mà chúng ta không phải lo lắng về vòng đời của ViewModel. Sau đây chúng ta có thể nhận dư liệu bằng cách gọi usersViewModel.getUserList()
III. ViewModel vs onSaveInstanceState()
Bạn có thể đặt câu hỏi: onSaveInstanceState() thường được sử dụng để lưu dữ liệu khi thay đổi cấu hình. Nhưng ViewModel không thể thay thế được onSaveInstanceState()
ViewModel chỉ lưu trữ activity khởi tạo lại khi xoay màn hình, ngoài ra, onSaveInstanceState() có thể tồn tại thông qua activity bị kill bởi hệ thống ví dụ khi ứng dụng ở background và hệ thống cần giải phóng bộ nhớ. Tất nhiên chỉ sử dụng onSaveInstanceState() nhưng nó có vài nhược điểm:
- Chỉ lưu trữ được lượng nhỏ dữ liệu
- Dữ liệu cần Parcelable, do đó nó không dễ cài đặt và khôi phục giá trị
Tuy vậy, khi nào cần sử dụng onSaveInstanceState()?
- Sử dụng ViewModel để lưu trữ dữ liệu hiện thời cho UI (get list friend user)
- sử dụng onSaveInstanceState() để lưu trữ dữ liệu cần thiết để lấy dữ liệu cho activity khi bị kill bởi hệ thống (id user)
Nhờ điều này, chúng ta sẽ xử lý cả hai trường hợp. Nếu activity của chúng ta sẽ bị kill bởi một hệ thống, chúng ta sẽ có thể truy xuất danh sách bạn bè của người dùng, vì chúng ta có id của người dùng. Và khi chúng ta sẽ nhận được danh sách, chúng ta có thể lưu trữ nó trong ViewModel và sử dụng nó ngay cả sau khi xoay màn hình.
IV. Tổng kết
Trên đây là chút chia sẻ về ViewModel trong Android. Cảm ơn các bạn đã theo dõi bài viết của mình Nguồn: https://android.jlelse.eu/android-architecture-components-viewmodel-e74faddf5b94
All rights reserved