2017-08-19 11 views
0

OTTOリスナをコンストラクタに登録してデータ準備完了イベントを待機するシングルトンのdataManagerオブジェクトを持つ。データマネージャーは、このdataMangerためGlobalOttoBus.instance.unregister(this)を呼び出していない場合、それはリスナー関数(楽しいのgetMessage(イベント:によってDataEvent))ですシングルトンオブジェクトのライブサイクルを管理する方法(オットーリスナーの登録解除場所)

DataManager.instance.functionOfIt() 

とどこにでも呼ばれているアプリケーションで は複数回呼び出す得ることができますアプリを開いた後アプリを最小化(OSがアプリケーションを破壊)してから、このデータマネージャーのコンストラクタが呼び出されたアプリを再度開いたときに観察される

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) 
} 

:データは、それがオットー・バスにデータをポストする準備ができている

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はコンストラクタ内で再びリスナーを登録します。

問題は、このシングルトンDataManagerのライフサイクルをどのように管理するのか、さらにはOTTOの登録を解除することですか?アプリを最小化してからアプリを再度開いた後、前のアプリはまだ生きている/聞いているようですが、新しいアプリのスコープでは見えません。

これは、トレース

  1. 初めてアプリ、コンストラクタ開始です:後にアプリを最小化し、アプリを再度開き、コンストラクタは、新しいインスタンス

    再び呼び出され

    08-19 11:32:33.558 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), this: [email protected] 
    
  2. 08-19 11:34:14.141 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), [email protected] 
    
  3. 1つの投稿:

    0123異なるデータマネージャーのインスタンスで呼び出さの
    08-19 11:34:15.242 5296-5380/xxxapplication W/GsonParse: +++ onResponse(), call GlobalOttoBus.instance.post(dataEvt): [email protected] 
    

2つのリスナー:

08-19 11:34:15.242 5296-5380/xxxapplication E/DataManager: +++ dataMgr::getMessage(), [email protected], [email protected] 

    08-19 11:34:15.395 5296-5380/xxxapplication E/DataManager: +++ dataMgr::getMessage(), [email protected], [email protected] 

答えて

0

それは活動が殺されることを意味ライフサイクルLifecycle.Event.ON_DESTROYになるよう、mainActivityでLifecycleRegistryOwnerを実装し、回避策を見つけ、 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() 
    } 
} 
関連する問題