0

Activity, ViewModel, Singleton 저장소 및 Room이 있습니다. activitiy의 OnCreate에서 나는 뷰 모델을 만들 :방 - 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() 
    } 
} 

Respository이 기능이매우 이상한 행동이 있습니다 : 처음 활동을 만들면 데이터가 잘 추출되고 모든 것이 작동합니다. MainActivity가 일시 중지 된 상태에서 두 번째 활동을 시작합니다. 주 활동으로 돌아간 후 눈에 보이지 않는 이유로 LiveData가 다시 트리거됩니다.

난 그냥 database.myDao().observeData() 대신 Flowable의 다오에 LiveData 반환에 LiveDataReactiveStream을 전환하는 노력과 활동이 재개 될 때 그 여분의 트리거의 이상한 행동을 고정.

그러나 더 복잡한 동작과 스레딩을 위해서는 use 나 rxjava가 필요합니다. 왜 그런 방아쇠가 생길지 모릅니다.

+0

언제'LiveData'를 관찰하기 시작합니까? 이것은 아마도 liveData.observe (...)라고하는 라이프 사이클 메소드와 관련이 있습니다. –

+0

@NikolaDespotoski 액티비티의 "OnCreate"메소드를 관찰하기 시작합니다 –

답변

0

PublisherLiveDatareactivestreams입니다. onInactive() 메서드에서 게시자의 구독을 취소하고 onActive()에 다시 구독합니다.

따라서 기본 활동으로 돌아 오면 onActive()이 발생하고 PublisherLiveData은 Flowable에 다시 등록되고 저장소에서 반환되며 저장소에서 데이터를받습니다.

나는 Flowable에 가입하고 ViewModelonCleared() 방법을 수동으로 삭제하고 reactivestreams를 사용하지 않는 끝났다.