从ViewModel执行网络操作

时间:2017-10-05 10:13:21

标签: android android-volley android-viewmodel

我正在使用在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
 }
}

所以我的问题是,

  1. 是否建议(或可能)在ViewModel中执行网络操作?
  2. 如果是(如果可能),该怎么做?

3 个答案:

答案 0 :(得分:0)

考虑Dagger,您不必担心,从suppressMenu: truecontext提供Volley

答案 1 :(得分:0)

您可以使用AndroidViewModel类代替ViewModel。 AndroidViewModel拥有对应用程序上下文的引用。

https://youtu.be/5qlIPTDE274

答案 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团队的建议。

enter image description here