У меня есть следующий проект в Github: https://github.com/Ali-Rezaei/Contacts
У меня есть экран Spla sh Активность. Как только начинается Activity, я хочу выполнить запрос, который я сделал, используя SharedViewModel. Вот мой класс репозитория:
@Singleton
class ContactsRepository
@Inject constructor() // Requires empty public constructor
{
@Inject
lateinit var context: Context
@Inject
lateinit var schedulerProvider: BaseSchedulerProvider
fun queryDb(selection: String?, selectionArgs: Array<String>?) {
val cursor = context.contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PROJECTION,
selection,
selectionArgs,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE UNICODE ASC")
return Observable.create(ObservableOnSubscribe<List<Contact>>
{ emitter -> emitter.onNext(ContactUtil.getContacts(cursor, context)) })
.subscribeOn(schedulerProvider.io())
.observeOn(schedulerProvider.ui())
.doFinally { cursor?.close() }
}
}
Я хочу наблюдать LiveData в MainActivity. У меня есть следующие ViewModel:
class ContactsViewModel(
private val repository: ContactsRepository)
: ViewModel() {
private val compositeDisposable = CompositeDisposable()
private val _liveData = MutableLiveData<Resource<List<Contact>>>()
val liveData: LiveData<Resource<List<Contact>>>
get() = _liveData
init {
_liveData.value = Resource.Loading()
showContacts(null, null)
}
fun showContacts(selection: String?, selectionArgs: Array<String>?) {
repository.queryDb(selection, selectionArgs).subscribe {
_liveData.postValue(Resource.Success(it))
}.also { compositeDisposable.add(it) }
}
/**
* Called when the ViewModel is dismantled.
* At this point, we want to cancel all disposables;
* otherwise we end up with processes that have nowhere to return to
* using memory and resources.
*/
override fun onCleared() {
super.onCleared()
compositeDisposable.clear()
}
/**
* Factory for constructing MainViewModel with parameter
*/
class Factory @Inject constructor(
private val repository: ContactsRepository
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ContactsViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return ContactsViewModel(repository) as T
}
throw IllegalArgumentException("Unable to construct ViewModel")
}
}
}
метод init вызовов ViewModel два раза (один раз в SplashActivity, а затем в MainActivity) Что мне нужно сделать, чтобы выполнить запрос только в SplashActivity и наблюдать liveData в MainActivity? Есть ли решение для обмена ViewModel между действиями?