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の登録を解除することですか?アプリを最小化してからアプリを再度開いた後、前のアプリはまだ生きている/聞いているようですが、新しいアプリのスコープでは見えません。
これは、トレース
初めてアプリ、コンストラクタ開始です:後にアプリを最小化し、アプリを再度開き、コンストラクタは、新しいインスタンス
再び呼び出され08-19 11:32:33.558 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), this: [email protected]
を
08-19 11:34:14.141 5296-5296/xxxapplication E/DataManager: +++ DataManager:ctor(), GlobalOttoBus.instance.register(), [email protected]
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]