До сих пор в моем приложении для Android я использовал общие настройки для хранения локальных данных. Сейчас я работаю над заменой его на Room Persistance Library.
То, что я пытаюсь сделать здесь, довольно просто, но у меня есть некоторые трудности с достижением желаемого результата.
Вот как моя проверка входа в систему работает с общими настройками:
SplashScreenActivity:
if (splashViewModel.isUserLoggedIn()) {
startActivity(Intent(this, ProfileScreenActivity::class.java))
} else {
startActivity(Intent(this, LoginScreenActivity::class.java))
}
SplashViewModel:
fun isUserLoggedIn(): Boolean {
return MainRepository.isUserLoggedIn()
}
Основной репозиторий:
fun isUserLoggedIn(): Boolean {
return MySharedPreferences.isUserLoggedIn()
}
Мои общие настройки:
fun isUserLoggedIn(): Boolean {
return preferences.getBoolean(ID_USER_LOGGED_IN, false)
}
Как видите - довольно просто и понятно.
Я смог добиться того же с помощью Room и LiveData, однако моя реализация приводит к странной задержке с SplashScreen, и я думаю, что в этом случае может быть что-то более простое.
Вот моя реализация Room & LiveData:
SplashScreenActivity:
splashViewModel.isUserLoggedInRoom()
splashViewModel.isLoggedIn.observe(this, {
if (it == true) {
startActivity(Intent(this, ProfileScreenActivity::class.java))
} else if (it == false) {
startActivity(Intent(this, LoginScreenActivity::class.java))
}
})
SplashViewModel:
private val _isLoggedIn: MutableLiveData<Boolean> = MutableLiveData()
val isLoggedIn: LiveData<Boolean> = _isLoggedIn
fun isUserLoggedInRoom() {
viewModelScope.launch(IO) {
val response = MainRepository.isUserLoggedInRoom()
withContext(Main) {
_isLoggedIn.value = response
}
}
}
Основной репозиторий:
fun isUserLoggedInRoom(): Boolean {
return loginInfoDao.isLoggedIn()
}
ЛогинИнфоДао:
@Query("SELECT isLoggedIn FROM LoginInfo WHERE id=$LoginInfoID")
fun isLoggedIn(): Boolean
Я был бы очень признателен, если бы вы могли указать мне правильное направление здесь. Спасибо!