如何管理单例对象的生命周期(在哪里取消注册 otto 侦听器)?
how to manager the singleton object's live cycle (where to unregister the otto listener)?
有一个单独的 dataManager 对象,该对象在其构造函数中注册 OTTO 侦听器以侦听数据就绪事件。
在应用程序中,dataManager 在任何地方都被称为
DataManager.instance.functionOfIt()
如果不为这个dataManger调用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)
}
… …
}
数据准备就绪后,pos将数据发送到 otto 总线:
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的生命周期?最小化应用后重新打开应用,好像之前的还在alive/listen但不在新应用的范围内
这是痕迹
第一次启动app,构造函数:
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
一个 post:
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
找到一个解决方法,在mainActivity中实现LifecycleRegistryOwner,所以在lifeCycle Lifecycle.Event.ON_DESTROY上意味着activity被杀死,所以注销DataManger的otto监听器。
class MainActivity : AppCompatActivity(), LifecycleRegistryOwner {
private val mRegistry: LifecycleRegistry = LifecycleRegistry(this);
private var theLifeCycleObserve: TheLifeCycleObserve? = null
override fun getLifecycle() : LifecycleRegistry {
return mRegistry
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar = findViewById<Toolbar>(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar)
……
theLifeCycleObserve = TheLifeCycleObserve(lifecycle, object : TheLifeCycleObserve.OnLifeCycleChange {
override fun onStar() {
}
override fun onDestroy() {
DataManager.instance!!.unregisterOttoBus()
lifecycle.removeObserver(theLifeCycleObserve)
}
})
lifecycle.addObserver(theLifeCycleObserve)
}
………
}
class TheLifeCycleObserve(private var lifecycle: LifecycleRegistry?, private var lifeCycleChangeListener: OnLifeCycleChange?) : LifecycleObserver {
interface OnLifeCycleChange {
fun onStar()
fun onDestroy()
}
init {}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
lifeCycleChangeListener!!.onStar()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
lifeCycleChangeListener!!.onDestroy()
}
}
有一个单独的 dataManager 对象,该对象在其构造函数中注册 OTTO 侦听器以侦听数据就绪事件。 在应用程序中,dataManager 在任何地方都被称为
DataManager.instance.functionOfIt()
如果不为这个dataManger调用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)
}
… …
}
数据准备就绪后,pos将数据发送到 otto 总线:
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的生命周期?最小化应用后重新打开应用,好像之前的还在alive/listen但不在新应用的范围内
这是痕迹
第一次启动app,构造函数:
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
一个 post:
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
找到一个解决方法,在mainActivity中实现LifecycleRegistryOwner,所以在lifeCycle Lifecycle.Event.ON_DESTROY上意味着activity被杀死,所以注销DataManger的otto监听器。
class MainActivity : AppCompatActivity(), LifecycleRegistryOwner {
private val mRegistry: LifecycleRegistry = LifecycleRegistry(this);
private var theLifeCycleObserve: TheLifeCycleObserve? = null
override fun getLifecycle() : LifecycleRegistry {
return mRegistry
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar = findViewById<Toolbar>(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar)
……
theLifeCycleObserve = TheLifeCycleObserve(lifecycle, object : TheLifeCycleObserve.OnLifeCycleChange {
override fun onStar() {
}
override fun onDestroy() {
DataManager.instance!!.unregisterOttoBus()
lifecycle.removeObserver(theLifeCycleObserve)
}
})
lifecycle.addObserver(theLifeCycleObserve)
}
………
}
class TheLifeCycleObserve(private var lifecycle: LifecycleRegistry?, private var lifeCycleChangeListener: OnLifeCycleChange?) : LifecycleObserver {
interface OnLifeCycleChange {
fun onStar()
fun onDestroy()
}
init {}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
lifeCycleChangeListener!!.onStar()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
lifeCycleChangeListener!!.onDestroy()
}
}