
2021.03.25 - [Android] - [Android] 검색어 저장 기능 구현해보기(dagger-hilt, room, coroutine, mvvm)
지난번에는 naver 영화 검색을 구현하고 검색 키워드 자동저장 기능을 Coroutine + Room으로 구현했다.
이번 포스팅에서는 이전에 놓친 부분들을 리팩토링하고 RxJava로 구현하고자 한다.
1) SearchEntity.kt
- entity부분은 이전 포스팅에서 변경된 부분은 없다.
@Entity(tableName = "search_history")
data class SearchEntity(
@PrimaryKey(autoGenerate = true)
val id: Int? = null,
@ColumnInfo(name = "search_query")
val searchQuery: String
)
2) Dao 수정
- coroutine을 사용하기 위해 suspend function으로 함수들을 만들어주었다.
- RxJava로 바꾸기 위해서 일반 함수로 고쳐준다.
- 데이터들을 가져오는 getAll()함수를 보면 Return Type이 Maybe로 선언되어있다.
RxJava2에서는 Observable에서 null값을 보내주게 되면 바로 NullPointerException이 발생한다.
이를 해결하기 위해서는,
1. Completable 사용
2. Maybe 사용
3. Enum을 선언하여 null 대신에 enum을 emit
Maybe는 값을 보낼 수도 있고, 안보낼 수도 있다.
값이 있는 경우에는 onSuccess, 값이 없는 경우에는 onComplete가 호출된다.
@Dao
interface SearchDao {
@Query("SELECT * FROM search_history")
fun getAll(): Maybe<List<SearchEntity>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(searchList: SearchEntity)
@Delete
fun delete(searchEntity: SearchEntity)
}
3) SearchHistoryRepository.kt
- Repository 또한 마찬가지로 suspend를 제거해준다.
class SearchHistoryRepository @Inject constructor(
private val searchDao: SearchDao
){
fun insert(searchEntity: SearchEntity)= searchDao.insert(searchEntity)
fun getAll() = searchDao.getAll()
fun delete(searchEntity: SearchEntity) = searchDao.delete(searchEntity)
}
4) SearchMovieViewModel.kt
private val compositeDisposable = CompositeDisposable()
@SuppressLint("CheckResult")
fun getSearchHistory() {
compositeDisposable.add(
searchHistoryRepository.getAll()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ _queryList.value = it },
{ it.printStackTrace() }
)
)
}
override fun onCleared() {
compositeDisposable.dispose()
super.onCleared()
}
- CompositeDisposable 객체를 선언해준다.
- CompositeDisposable클래스를 이용하면 생성된 모든 Observable을 android lifecycle에 맞춰 한번에 해제할 수 있다.
- ViewModel에서는 onCleared()에서 CompositeDisposable을 해제시켜야한다. » dispose()
5) SearchMovieFragment.kt
private fun getSearchHistory() {
viewModel.queryList.observe(viewLifecycleOwner, Observer {
searchHistoryAdapter.submitList(viewModel.queryList.value!!)
detectSearchViewFocus()
})
}
- view단계에서 queryList가 변하면 Recyclerview를 갱신해주었다!
'Android' 카테고리의 다른 글
| [Android] Multi Select Gallery만들기 with Paging (0) | 2021.04.05 |
|---|---|
| [Android] Paging3 Library in Jetpack (0) | 2021.04.05 |
| [Android] 검색어 저장 기능 구현해보기(dagger-hilt, room, coroutine, mvvm) (0) | 2021.03.25 |
| [Android] Naver검색 api - RxJava, Retrofit, MVVM, Hilt (0) | 2021.03.22 |
| [Android] Naver Map API 띄우기 (kotlin) (0) | 2021.03.19 |