AndroidViewModel vs ViewModel


159

ด้วยการแนะนำของห้องสมุด Android สถาปัตยกรรมองค์ประกอบในชั้นเรียนใหม่ ๆ ที่ถูกนำมารวมทั้งและAndroidViewModel ViewModelอย่างไรก็ตามฉันมีปัญหาในการค้นหาความแตกต่างระหว่างสองคลาสนี้ เอกสารชัดถ้อยชัดคำอธิบายAndroidViewModelดังต่อไปนี้:

แอปพลิเคชันตระหนักถึงบริบท ViewModel

ฉันซาบซึ้งในความกะทัดรัด แต่สิ่งนี้บอกเป็นนัย ๆ ว่าอะไร? เมื่อเราควรเลือกที่จะใช้AndroidViewModelมากกว่าViewModelและในทางกลับกัน?

คำตอบ:


223

AndroidViewModel จัดเตรียมบริบทของแอปพลิเคชัน

หากคุณต้องการใช้บริบทภายใน Viewmodel ของคุณคุณควรใช้ AndroidViewModel (AVM) เนื่องจากมีบริบทของแอปพลิเคชัน เมื่อต้องการดึงการเรียกบริบทgetApplication()มิฉะนั้นใช้ ViewModel (VM) ปกติ

AndroidViewModel มีบริบทการประยุกต์ใช้ เราทุกคนรู้ว่าการมีอินสแตนซ์บริบทแบบสแตติกนั้นชั่วร้ายเพราะอาจทำให้หน่วยความจำรั่ว !! อย่างไรก็ตามการมีอินสแตนซ์ของแอปพลิเคชันแบบสแตติกนั้นไม่เลวอย่างที่คุณคิดเพราะมีเพียงหนึ่งอินสแตนซ์ของแอปพลิเคชันในแอปพลิเคชันที่ทำงานอยู่

ดังนั้นการใช้และการมีอินสแตนซ์ของแอปพลิเคชันในคลาสที่ระบุไม่ใช่ปัญหาโดยทั่วไป แต่ถ้าอินสแตนซ์ของแอปพลิเคชันอ้างอิงถึงพวกเขามันเป็นปัญหาเนื่องจากปัญหารอบการอ้างอิง

ดูเพิ่มเติมเกี่ยวกับ Application Instance

AndroidViewModel Problematic สำหรับการทดสอบหน่วย

AVM จัดเตรียมบริบทแอปพลิเคชันซึ่งเป็นปัญหาสำหรับการทดสอบหน่วย การทดสอบหน่วยไม่ควรเกี่ยวข้องกับวงจรชีวิต Android ใด ๆ เช่นบริบท


42
ทำไมไม่ใช้ AndroidViewModel เสมอ คุณอาจต้องการบริบทในภายหลังแม้ว่าคุณจะไม่ต้องการมันในตอนนี้ มีข้อเสียอะไรบ้าง?
ต. เร็กซ์

20
@ T.Rex หากคุณดูรหัสมันจะขยายออกไปViewModelโดยมีเพียงฟิลด์ที่ชี้ไปยังแอปพลิเคชัน ถ้าฉันไม่ต้องการฉันไม่ชอบให้ตัวสร้างแบบบังคับพร้อมApplicationพารามิเตอร์ (ซึ่งAndroidViewModelต้องการ) และใช้ViewModelแทน เมื่อฉันต้องการบริบทในอนาคตฉันสามารถเปลี่ยนแปลงได้ง่าย
บอย

3
ใช้ViewModelเมื่อคุณต้องการใช้กับ Fragment หรือเพื่อแบ่งปันViewModelระหว่างแฟรกเมนต์ต่าง ๆ ของกิจกรรมเดียวกัน
codelearner

22
@ T.Rex จะไม่ใช้AndroidViewModel- การเป็นContextอิสระ - ทำให้เป็นไปไม่ได้ที่จะทดสอบในการทดสอบหน่วยปกติ ฉันยังไม่ได้เล่นกับตัวเอง (ยัง) มันเป็นเพียงความคิด
Konrad Morawski

2
AndroidViewModel และ ViewModel เหมือนกันความแตกต่างเพียงอย่างเดียวคือ AndroidViewModel มีบริบทของแอปพลิเคชัน คุณสามารถใช้ ViewModel และส่งบริบทไปยัง ViewModel เพื่อทำหน้าที่โหลดข้อมูลจาก MediaStore หรือใช้ AndroidViewModel กับบริบทแอปพลิเคชัน
อเล็กซ์

10

ในที่สุดฉันก็ได้คำอธิบายที่ง่ายกว่าเล็กน้อย ...... ...... คลาส AndroidViewModel เป็นคลาสย่อยของ ViewModel และคล้ายกับพวกเขาพวกเขาถูกออกแบบมาเพื่อจัดเก็บและจัดการข้อมูลที่เกี่ยวข้องกับ UI มีหน้าที่เตรียมความพร้อมและให้ข้อมูล สำหรับ UI และอนุญาตให้ข้อมูลโดยอัตโนมัติเพื่อความอยู่รอดการเปลี่ยนแปลงการกำหนดค่า

ความแตกต่างเพียงอย่างเดียวกับ AndroidViewModel คือมันมาพร้อมกับบริบทของแอปพลิเคชันซึ่งมีประโยชน์หากคุณต้องการบริบทเพื่อรับบริการระบบหรือมีข้อกำหนดที่คล้ายกัน ข้อความหนาทำให้ชัดเจนขึ้น


1
สื่ออย่างเป็นทางการmedium.com/androiddevelopers/…
Neeraj Sewani

4

AndroidViewModelเป็น subclass ของViewModel ความแตกต่างระหว่างพวกเขาคือเราสามารถส่งผ่านบริบทของแอปพลิเคชันซึ่งสามารถนำมาใช้เมื่อใดก็ตามที่จำเป็นต้องใช้บริบทของแอปพลิเคชันเพื่อยกตัวอย่างฐานข้อมูลในพื้นที่เก็บข้อมูล

AndroidViewModelเป็นแอปพลิเคชัน ViewModel ที่รับรู้บริบท

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();
}

คุณควรใช้AndroidViewModelเมื่อคุณต้องการบริบทแอปพลิเคชันเท่านั้น

คุณไม่ควรจัดเก็บข้อมูลอ้างอิงของกิจกรรมหรือมุมมองที่อ้างอิงกิจกรรมใน ViewModel เพราะ ViewModel ถูกออกแบบมาเพื่อให้มีอายุการใช้งานนานกว่าและจะทำให้ Memory Leak หาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.