Использование SharedViewModel между операциями - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть следующий проект в 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 между действиями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...