AndroidViewModel vs ViewModel


158

Với sự ra đời của thư viện Thành phần Kiến trúc Android, một số lớp mới đã được giới thiệu, bao gồm AndroidViewModelViewModel. Tuy nhiên, tôi gặp khó khăn khi tìm ra sự khác biệt giữa hai lớp này. Các tài liệu mô tả ngắn gọn AndroidViewModelnhư sau:

Nhận thức bối cảnh ứng dụng ViewModel

Tôi đánh giá cao sự ngắn gọn, nhưng chính xác điều này ngụ ý gì? Khi nào chúng ta nên chọn sử dụng AndroidViewModelhơn ViewModelvà ngược lại?

Câu trả lời:


222

AndroidViewModel cung cấp ngữ cảnh ứng dụng

Nếu bạn cần sử dụng bối cảnh bên trong Viewmodel, bạn nên sử dụng AndroidViewModel (AVM), vì nó chứa bối cảnh ứng dụng. Để truy xuất cuộc gọi ngữ cảnh getApplication(), nếu không, hãy sử dụng ViewModel (VM) thông thường.

AndroidViewModel có bối cảnh ứng dụng . Chúng ta đều biết có trường hợp bối cảnh tĩnh là xấu vì nó có thể gây rò rỉ bộ nhớ !! Tuy nhiên, có phiên bản Ứng dụng tĩnh không tệ như bạn nghĩ vì chỉ có một phiên bản Ứng dụng trong ứng dụng đang chạy.

Do đó, việc sử dụng và có cá thể Ứng dụng trong một lớp cụ thể không phải là vấn đề chung. Nhưng, nếu một cá thể Ứng dụng tham chiếu đến chúng, thì đó là một vấn đề do vấn đề chu trình tham chiếu.

Xem thêm về Sơ thẩm ứng dụng

AndroidViewModel Có vấn đề đối với các bài kiểm tra đơn vị

AVM cung cấp bối cảnh ứng dụng có vấn đề cho thử nghiệm đơn vị. Các thử nghiệm đơn vị không nên đối phó với bất kỳ vòng đời Android nào, chẳng hạn như bối cảnh.


40
Tại sao không luôn luôn sử dụng AndroidViewModel? sau này bạn có thể cần bối cảnh ngay cả khi bạn không cần nó ngay bây giờ. Có bất kỳ nhược điểm nào không?
T. Rex

19
@ T.Rex Nếu bạn nhìn vào mã, nó sẽ mở rộng ViewModelchỉ bằng một trường trỏ đến Ứng dụng. Nếu tôi không cần nó, tôi không thích có một hàm tạo bắt buộc có Applicationtham số ( AndroidViewModelyêu cầu) và thay vào đó chỉ sử dụng ViewModel. Khi tôi cần một bối cảnh trong tương lai, tôi có thể dễ dàng thay đổi nó sau đó.
Cậu bé

3
Sử dụng ViewModelkhi bạn muốn sử dụng nó với Fragment hoặc để chia sẻ ViewModelgiữa các mảnh khác nhau của cùng một Hoạt động.
codelearner

22
@ T.Rex sẽ không sử dụng AndroidViewModel- là Contextphụ thuộc - làm cho không thể kiểm tra nó trong một bài kiểm tra đơn vị thông thường, chỉ để lại các bài kiểm tra thiết bị như một khả năng? Bản thân tôi chưa từng đùa giỡn với nó, đó chỉ là một ý nghĩ
Konrad Morawski

2
AndroidViewModel và ViewModel giống nhau, điểm khác biệt duy nhất là AndroidViewModel chứa bối cảnh ứng dụng. Bạn có thể sử dụng ViewModel và chuyển ngữ cảnh sang ViewModel để thực hiện chức năng tải dữ liệu từ MediaStore hoặc sử dụng AndroidViewModel với ngữ cảnh ứng dụng.
Alex

9

Cuối cùng tôi cũng nhận được một lời giải thích đơn giản hơn, một chút ...... ... Lớp AndroidViewModel là một lớp con của ViewModel và tương tự như chúng, chúng được thiết kế để lưu trữ và quản lý dữ liệu liên quan đến UI có trách nhiệm chuẩn bị & cung cấp dữ liệu cho UI và tự động cho phép dữ liệu tồn tại thay đổi cấu hình.

Sự khác biệt duy nhất với AndroidViewModel là nó đi kèm với bối cảnh ứng dụng, rất hữu ích nếu bạn yêu cầu bối cảnh để có được một dịch vụ hệ thống hoặc có yêu cầu tương tự. các văn bản in đậm làm cho nó rõ ràng hơn để cảm nhận nó.



4

AndroidViewModel là lớp con của ViewModel . Sự khác biệt giữa chúng là chúng ta có thể vượt qua Bối cảnh ứng dụng có thể được sử dụng bất cứ khi nào Bối cảnh ứng dụng được yêu cầu để khởi tạo Cơ sở dữ liệu trong Kho lưu trữ.

AndroidViewModel là một ứng dụng ViewModel nhận biết ngữ cảnh ứng dụng.

AndroidViewModel:

public class PriceViewModel extends AndroidViewModel {
private PriceRepository priceRepository;

public PriceViewModel(@NonNull Application application) {
    super(application);
    priceRepository= new PriceRepository(application);
    allPrices = priceRepository.getAllPrices();
}

ViewModel:

public class PriceViewModel extends ViewModel {
public PriceViewModel() {
    super();
}

Bạn chỉ nên sử dụng AndroidViewModel khi bạn yêu cầu Bối cảnh ứng dụng.

Bạn không bao giờ nên lưu trữ một tham chiếu của hoạt động hoặc một chế độ xem tham chiếu một hoạt động trong ViewModel. Bởi vì ViewModel được thiết kế để tồn tại lâu hơn một hoạt động và nó sẽ gây ra Rò rỉ bộ nhớ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.