как управлять жизненным циклом одноэлементного объекта (где отменить регистрацию прослушивателя otto)?

Наличие одноэлементного объекта 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? После сворачивания приложения, а затем повторного открытия приложения кажется, что предыдущее все еще живо/слушается, но не в области действия нового приложения.

это след

  1. первый запуск приложения, конструктор:

    08-19 11:32:33.558 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), this: DataManager@94fd499
    
  2. после сворачивания приложения и повторного открытия приложения конструктор снова вызывается новым экземпляром

    08-19 11:34:14.141 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), DataManager@661f37d
    
  3. один пост:

    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

person lannyf    schedule 19.08.2017    source источник


Ответы (1)


Найдите обходной путь, внедрите LifecycleRegistryOwner в mainActivity, чтобы в lifeCycle Lifecycle.Event.ON_DESTROY это означало, что активность уничтожена, поэтому отмените регистрацию прослушивателя otto DataManger.

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()
    }
}
person lannyf    schedule 19.08.2017