-1. 이전글
2018/12/10 - [rxJava 공부] - RxJava 공부 3 - Map과 FlatMap, Timer와 interval, FlatMap과 ConcatMap
0. 고찰
Room을 다루던 도중에, Room을 이요해서 db값을 꺼내보니까, 쓰레드를 이용해서 값을 변경하고 ui를 변경해야 했다.
그래서 쉽게 생각할 수 있는게 AsyncTask를 이용해서 doInBackground()를 이용하고, onPostExecute()를 이용하는 것이었는데,
Room은 아래로 길어지기 때문에 AsyncTask와 어울리지 않고, rx와 어울린다고 생각을 했습니다.
그렇다면 비동기 값이 난 후에 데이터를 처리해야 한다면, rx로 어떻게 해야할까...?
라는 고찰이 있었습니다.
1. 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Observable.fromCallable { val checkTimeDB = Room.databaseBuilder(activity, AppDataBase::class.java, "CHECK_TIME.db").build() val timeLiveData = checkTimeDB.dailyTimeDao().getTodayTime(yyyyMMdd) var mTodayWorker = 0 mTodayWorker = if (timeLiveData.isEmpty()) { 0 } else { timeLiveData[0].studyTime!!.toInt() } return@fromCallable mTodayWorker } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ mTodayWorker -> updateTimerUI(mTodayWorker) }, {}, {}) | cs |
2. 해석
Observable.fromCallable{useRoom(); return data}.subscribeOn().observenOn().subscribe({},{},{})
이와 같은 구조로 이루어져있고, fromCallable을 통해서 비동기작업을 처리하고 난 후에,
나온 값을 return하고 subscribe로 전달하는 구조 입니다.
3. Callable이 뭐지?
Callable은 비동기처리를 하기 위해서 사용하는 것이고, 우리는 대부분의 비동기작업은 여태까지 Runnable을 이용했습니다.
하지만 Runnable을 통해서는 값을 return 받을 수 없는 구조였고, 이것을 해결하기 위해서 Callable이 나왔다고 생각합니다.
즉, callable은 비동기작업이 일어난 경우에 해당 작업의 값을 변수로 받을 수 있게 되는 것입니다.
JavaScript에서는 흡사, Promise를 통해서 로직을 처리하는 것과 같은 느낌이 났습니다.
4. 위의 코드를 다시 해석
fromCallable을 통해서 Room을 통해서 값이 나오는 비동기 처리를 기다리게 됩니다.
그래서 값이 나오게 되면 return@fromCallable data 를 통해서 값을 return 받게 되고 해당 값을 subscribe로 이동시켜서 ui를 update시키게 됩니다.
5. 평가
Callable은 FirebaseRealbase, 각종 비동기 작업을 처리하기 때문에 꼭 알아야하는 지식이다.
개인적으로 만들고 있는 어플리케이션 입니다.
2018/10/21 - [나의 일기] - (리뷰) 시간표 어플리케이션 - 담다
2018/07/15 - [나의 일기] - #담아두다 #일상 #다이어리 #어플리케이션