코 틀린 흐름과 LiveData


10

마지막 Google I / O에서 Jose Alcerreca와 Yigit Boyar 는 더 이상 LiveData를 사용하여 데이터를 가져 오지 않아야한다고 말했습니다 . 이제 원샷 페치에 suspend 함수를 사용하고 Kotlin의 Flow를 사용하여 데이터 스트림을 작성해야합니다. 코 루틴은 원샷 페치 또는 삽입과 같은 다른 CRUD 작업에 유용하다는 데 동의합니다. 그러나 데이터 스트림이 필요한 경우 Flow가 제공하는 이점을 이해하지 못합니다. LiveData가 동일한 작업을 수행하는 것 같습니다.

흐름이있는 예 :

뷰 모델

val items = repository.fetchItems().asLiveData()

저장소

fun fetchItems() = itemDao.getItems()

다오

@Query("SELECT * FROM item")
fun getItems(): Flow<List<Item>>

LiveData를 사용한 예 :

뷰 모델

val items = repository.fetchItems()

저장소

fun fetchItems() = itemDao.getItems()

다오

@Query("SELECT * FROM item")
fun getItems(): LiveData<List<Item>>

또한 Coroutines와 Flow를 사용하여 Room 또는 Retrofit과 함께 작업하는 프로젝트의 예를보고 싶습니다. 코 루틴이 원샷 페칭에 사용 된 다음 변경시 데이터를 수동으로 리 페치 하는 Google의 ToDo 샘플 만 발견했습니다 .

답변:


3

Flow일종의 reactive stream(rxjava와 같은)입니다. 같은 다른 사업자의 무리가있다 .map, buffer()(어쨌든 적은 없음. 운영자의 rxJava에 비해). 그래서 사이의 주요 차이점 중 하나 LiveDataFlowu는지도를 구독 할 수 있다는 것입니다 computation / transformation사용하여 다른 스레드를

 flowOn(Dispatcher....). 

예를 들어 :-

 flowOf("A","B","C").map { compute(it) }.flowOn(Dispatchers.IO).collect {...} // U can change the execution thread of the computation ( by default its in the same dispatcher as collect )

LiveData하고 map, 위 캔트 직접 얻을 수!

따라서 저장소 수준에서 흐름을 유지하고 라이브 데이터를 UI와 저장소 사이의 브릿지로 만드는 것이 좋습니다!

주요 차이점은 flow가지고 livedata있지 않은 다른 연산자 가 많이 있다는 것입니다! 그러나 다시, 그것은 당신의 프로젝트를 어떻게 구성하고 싶습니까?


3

이름에서 알 수 있듯이 Flow는 여러 비동기식으로 계산 된 값의 연속적인 흐름처럼 생각할 수 있습니다. 내 관점에서 LiveData와 Flow의 주요 차이점은 Flow는 지속적으로 결과를 내보내고 모든 데이터를 가져올 때 LiveData가 업데이트되고 모든 값을 한 번에 반환한다는 것입니다. 귀하의 예에서 단일 값을 가져오고 있는데 이는 내 의견으로는 Flow가 정확하게 작성된 것이 아닙니다.

Room 예제는 없지만 시간이 걸리는 것을 렌더링한다고 가정하지만 다음 결과를 렌더링하고 버퍼링하는 동안 결과를 표시하고 싶습니다.

private fun render(stuffToPlay: List<Any>): Flow<Sample> = flow {
     val sample = Sample()
     // computationally intensive operation on stuffToPlay
     Thread.sleep(2000)
     emit(sample)
}

그런 다음 '재생'기능에서 stuffToPlay가 렌더링 할 객체 목록 인 결과를 표시 할 수 있습니다.

playbackJob = GlobalScope.launch(Dispatchers.Default) {

    render(stuffToPlay)
        .buffer(1000)   // tells the Flow how many values should be calculated in advance

        .onCompletion {
            // gets called when all stuff got played
        }
        .collect{sample ->
           // collect the next value in the buffered queue
           // e.g. display sample
        }
}

Flow의 중요한 특성은 빌더 코드 (여기서는 렌더링 함수)가 수집 될 때만 실행되므로 콜드 스트림이라는 것입니다.

비동기 흐름 에서 문서를 참조 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.