Как работает onCleared AndroidViewModel [android-architecture-component]

Я использую AndroidViewModel и возвращаю поток данных, будь то Observable или LiveData, пока все идет хорошо, я вижу, что в классе ViewModel есть метод, говорится в документе onCleared()

Этот метод будет вызываться, когда эта ViewModel больше не используется и будет уничтожен. Это полезно, когда ViewModel наблюдает за некоторыми данными, и вам необходимо очистить эту подписку, чтобы предотвратить утечку этой ViewModel.

У меня есть сценарий, в котором я возвращаю Single<ApiResponse> из модернизации, делаю несколько .map() в ViewModel и возвращаю ответ как Single<ToBeShownOnUiResponse>. Я подписываюсь на это в View, то есть фрагмент. Я добавляю подписчика в CompositeDisposable и после этого очищаю onStop фрагмент. Когда я перехожу от LoginActivity (удерживайте фрагмент signin / signup / passwordreset) к HomeActivity (удерживайте tablayout с другими фрагментами), я не вижу журналов, записанных в методе onCleared () класса ViewModel. Я делаю что-то не так, или я все испортил.

Я спрашиваю, каким образом onCleared() мне полезен. Какой отдельный код или очистку я должен написать в нем?

Использование: когда мне нужен строковый ресурс, я использую AndroidViewModel (форматирование некоторого ответа api в соответствии с строковым ресурсом, представленным в xml), и когда требуется только вызов api, я использую ViewModel.


person silentsudo    schedule 11.10.2017    source источник
comment
вы можете утилизировать одноразовый предмет в onCleared в вашей модели просмотра. хороший блог, если вам нужен код proandroiddev.com/   -  person Raghunandan    schedule 15.10.2017
comment
правильно, но в соответствии с образцами Google они написали одноразовые в View (Activity / Fragment), а не в ViewModels   -  person silentsudo    schedule 15.10.2017
comment
это также может сработать, что вы делаете, это отписывайтесь, когда действие / фрагмент уничтожается   -  person Raghunandan    schedule 16.10.2017


Ответы (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()
}
person Neoh    schedule 31.03.2020