Наличие одноэлементного объекта dataManager, который регистрирует прослушиватель OTTO в своем конструкторе для прослушивания события готовности данных. В приложении dataManager упоминается в любом месте как
DataManager.instance.functionOfIt()
Если не вызвать GlobalOttoBus.instance.unregister(this) для этого менеджера данных, то его функция прослушивателя (fun getMessage(event: DataEvent)) может получить вызов несколько раз после повторного открытия приложения.
class DataManager {
private var mApplication: Application? = null
companion object {
val TAG = DataManager::class.java.name
private var dataMgr: DataManager? = null
val instance: DataManager?
@Synchronized get() {
return dataMgr
}
}
constructor(application: Application) {
mApplication = application
dataMgr = this
Log.e(TAG, "+++ DataManager:ctor(), GlobalOttoBus.instance.register()");
// have no way to to unregister in this DataManager ??? ???
GlobalOttoBus.instance.register(this)
}
@Subscribe
fun getMessage(event: DataEvent) {
Log.e(Tag, "+++ dataMgr::getMessage(), ${this}, ${event}")
onDataReady(event)
}
… …
}
Когда данные готовы, он отправляет данные в otto bus:
override fun onResponse(call: Call?, response: Response?) {
if (response!!.isSuccessful()) {
// parse the data ……
// then post data ready event
var dataEvt: DataEvent = DataEvent()
dataEvt.setPostData(posts)
Log.d(“GsonParse”, "+++ onResponse(), call GlobalOttoBus.instance.post(dataEvt): ${dataEvt} ")
GlobalOttoBus.instance.post(dataEvt)
}
Это наблюдается, когда сворачивает приложение (os уничтожает приложение), а затем повторно открывает приложение, вызывается конструктор этого DataManager (новый экземпляр в этом новом сеансе), поэтому он снова регистрирует прослушиватель OTTO в своем конструкторе.
Проблема заключается в том, где отменить регистрацию в OTTO или как управлять жизненным циклом этого одноэлементного DataManager? После сворачивания приложения, а затем повторного открытия приложения кажется, что предыдущее все еще живо/слушается, но не в области действия нового приложения.
это след
первый запуск приложения, конструктор:
08-19 11:32:33.558 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), this: DataManager@94fd499
после сворачивания приложения и повторного открытия приложения конструктор снова вызывается новым экземпляром
08-19 11:34:14.141 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), DataManager@661f37d
один пост:
08-19 11:34:15.242 5296-5380/xxxapplication W/GsonParse: +++ onResponse(), call GlobalOttoBus.instance.post(dataEvt): DataEvent@f5a0df6
два слушателя вызываются в разных экземплярах dataManager:
08-19 11:34:15.242 5296-5380/xxxapplication E/DataManager: +++ dataMgr::getMessage(), DataManager@94fd499, DataEvent@f5a0df6
08-19 11:34:15.395 5296-5380/xxxapplication E/DataManager: +++ dataMgr::getMessage(), DataManager@661f37d, DataEvent@f5a0df6