如何onCleared工作AndroidViewModel [android-architecture-component]

时间:2017-10-11 17:07:57

标签: android mvvm android-architecture-components

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

  

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

我有一个场景,我从改造中返回Single<ApiResponse>.map()中做一些ViewModel并返回响应Single<ToBeShownOnUiResponse>我在View that Fragment中订阅了这个。 我将订阅者添加到CompositeDisposable,然后清除onStop片段。当我从LoginActivity(保持signin / signup / passwordreset片段)导航到HomeActivity(用其他片段保持tablayout)时,我看不到用ViewModel类的onCleared()方法编写的日志。我正在做的事情是错的,或者我把它弄得一团糟。

我的问题是onCleared()以什么方式对我有帮助。我应该写什么单独的代码或清理?

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

1 个答案:

答案 0 :(得分:0)

调用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()
}