我正在使用在IO / 17中引入的ViewModel。
我正在使用Android开发者页面上提供的以下指南。 https://developer.android.com/topic/libraries/architecture/viewmodel.html
以下是他们的示例代码。
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(pubKey);
signature.update(data);
boolean verified = signature.verify(signatureBytes);
我希望在' loadUsers()'中执行排球请求方法。但我不能这样做,因为它需要一个' 上下文'如下
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
所以我的问题是,
答案 0 :(得分:0)
考虑Dagger,您不必担心,从suppressMenu: true
为context
提供Volley
。
答案 1 :(得分:0)
您可以使用AndroidViewModel类代替ViewModel。 AndroidViewModel拥有对应用程序上下文的引用。
答案 2 :(得分:0)
AndroidViewModel 是 ViewModel 的子类。它们之间的区别是我们可以传递应用程序上下文,该上下文可在需要应用程序上下文时使用,例如在存储库中实例化数据库。
AndroidViewModel 是可识别应用程序上下文的ViewModel。您必须将AndroidViewModel用于应用程序上下文。
public class MyViewModel extends AndroidViewModel {
private MutableLiveData<List<User>> users;
private Application application;
public MyViewModel(@NonNull Application application) {
this.application=application;
super(application);
}
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Pass Context to Repository
}}
您应该永远不要在ViewModel中存储活动的引用或引用该活动的视图。因为ViewModel的设计目的是使活动失效,并且会导致内存泄漏。
是否建议(或可能)在一个内部执行网络操作 ViewModel?
否,您不应在ViewModel内部执行网络操作。
如果可以(如果可能),该怎么办?
使用AndroidModelView获取应用程序上下文,并将其传递到存储库, 按照Android团队的建议。