【问题标题】:Performing network operations from ViewModel从 ViewModel 执行网络操作
【发布时间】:2018-03-16 22:12:56
【问题描述】:

我正在使用 IO/17 中引入的 ViewModel。

我正在使用 android 开发者页面上提供的以下指南。 https://developer.android.com/topic/libraries/architecture/viewmodel.html

以下是他们的示例代码。

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
 }
}

我希望在 'loadUsers()' 方法中执行 Volley 请求。但我不能这样做,因为它需要一个 'context' 如下

Volley.newRequestQueue(context).add(jsonObjectRequest);

所以我的问题是,

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

【问题讨论】:

  • 我得到了我的答案...发布晚... API 调用可以从 VM 进行。但是由于我使用的是 volley,所以我唯一关心的是在视图类(活动/片段)之外传递上下文,这会导致问题。我通过改造解决了这个问题。

标签: android android-volley android-viewmodel


【解决方案1】:

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

https://youtu.be/5qlIPTDE274

【讨论】:

【解决方案2】:

考虑Dagger,这样您就不必担心从您的ViewModelVolley 提供context

【讨论】:

    【解决方案3】:

    AndroidViewModelViewModel 的子类。它们之间的区别在于我们可以传递应用程序上下文,它可以在需要应用程序上下文时使用,例如在存储库中实例化数据库。

    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 中执行网络操作。

    如果是(如果可能的话),怎么做?

    使用 AndroidModelView 获取 Application Context 并将其传递给 Repository, 由 Android 团队推荐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多