【问题标题】:How onCleared works AndroidViewModel [android-architecture-component]onCleared 如何工作 AndroidViewModel [android-architecture-component]
【发布时间】:2017-10-11 17:07:57
【问题描述】:

我正在使用 AndroidViewModel 并返回数据流,无论是 Observable 还是 LiveData,到目前为止一切顺利,我看到 ViewModel 类中有一个方法,onCleared() 文档说

当这个 ViewModel 不再被使用时会调用这个方法并且 将被销毁。当 ViewModel 观察到一些数据并且 您需要清除此订阅以防止泄漏 视图模型。

我有一个场景,我从改造中返回Single<ApiResponse>,在ViewModel 中执行一些.map() 并以Single<ToBeShownOnUiResponse> 的形式返回响应,我在视图中订阅了这个,即片段。 我将订阅者添加到CompositeDisposable,然后将其清除onStop 片段。当我从 LoginActivity(保留登录/注册/密码重置片段)导航到 HomeActivity(与其他片段一起保留 tablayout)时,我看不到在 ViewModel 类的 onCleared() 方法中写入的日志。是我做错了什么还是我做的一团糟。

我的疑问是onCleared() 对我有什么帮助。我应该在里面写什么单独的代码或清理?

用法: 当我需要字符串资源时,我使用AndroidViewModel(根据xml中存在的字符串资源格式化一些api响应),当只有api调用需要我使用ViewModel

【问题讨论】:

  • 您可以在视图模型中的 onCleared 中处理一次性用品。如果您需要代码proandroiddev.com/…,这是一个不错的博客
  • 正确,但根据谷歌示例,他们在 View(Activity/Fragment) 中而不是在 ViewModels 中编写了一次性
  • 也可以在活动/片段被销毁时取消订阅

标签: android mvvm android-architecture-components


【解决方案1】:

调用onCleared 的一个示例用例是当您使用ViewModel 进行应用内结算时。在这种情况下,很自然地让 BillingClient 持续一个活动(在下面的示例中我使用了Application),例如这样:

class BillingViewModel(application: Application)
  : AndroidViewModel(application), PurchasesUpdatedListener, BillingClientStateListener {

  private lateinit var playStoreBillingClient: BillingClient

  init {
    playStoreBillingClient = BillingClient.newBuilder(application.applicationContext)
        .enablePendingPurchases()
        .setListener(this).build()
    playStoreBillingClient.startConnection(this)
  }

...

 override fun onCleared() {
    super.onCleared()
    playStoreBillingClient.endConnection()
}

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多