0

私はActivity、ViewModel、SingletonリポジトリとRoomを持っています。ルーム - LiveData RxJavaは理由なしにトリガーされました

viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) 
viewModel.myData.observe(this, Observer { data -> 
     Log.d("livedata","triggred") 
    }) 

MainViewModel:

fun getData(): LiveData<Int> { 
    return LiveDataReactiveStreams.fromPublisher(database.myDao() 
      .observeData()) 
} 

MyDao:

@Query("SELECT COUNT(*) FROM my_table") 
fun fetchData(): Flowable<Int> 
class MyWorkoutViewModel (application: Application) : AndroidViewModel(application) { 
    // Getting the singleton repository 
    private var repository = (application as MyApp).repository 

    val myData: LiveData<Int> by lazy { 
     repository.getData() 
    } 
} 

リポジトリーこの機能を持っている私はViewModelには、作成activitiyのOnCreateで私は非常に奇妙な振る舞いを持っています: 初めてアクティビティが作成されると、データがうまくフェッチされ、すべてが機能します。その後、MainActivityは一時停止したままで2番目のアクティビティーを開始します。主なアクティビティに戻ると、目に見える理由がなくなり、LiveDataが再びトリガされます。

私はちょうどdatabase.myDao().observeData()LiveDataReactiveStreamを切り替えしようとしましたが、代わりにFlowableのダオでLiveDataを返すと、活動が再開されたときには、その余分なトリガーの奇妙な行動を修正しました。

しかし、より複雑なアクションやスレッド化には、useまたはrxjavaが必要です。そのトリガーはなぜ起こりますか?

+0

「LiveData」の観測はいつ始まりますか?これはおそらく、いつliveData.observe(...)と呼ばれるライフサイクルメソッドに関連していますか –

+0

@NikolaDespotoskiアクティビティの "OnCreate"メソッドで監視を開始します –

答えて

0

PublisherLiveDataからreactivestreamsまでです。 onInactive()メソッドの発行者からの登録を解除し、onActive()に再度購読します。だから、

、あなたのメインの活動に戻ったとき、あなたのリポジトリによって返さフロアブルにonActive()トリガ、PublisherLiveData再サブスクライブ、そしてあなたがリポジトリからデータを受け取ります。

私はFlowableに加入し、ViewModelonCleared()方法で手動でクリアしreactivestreamsを使用していないことになりました。

関連する問題