Передача данных из репозитория в модель просмотра без каких-либо сторонних поставщиков

#android #kotlin #repository #viewmodel #android-livedata

Вопрос:

Я хочу вернуть данные из репозитория в viewmodel без использования каких-либо сторонних

     class MyRepository{
        
    // Some code that return the data from webservice
        
}


class MyViewModel:ViewModel(){
    
init{
    val repo= MyRepository()
    MyRepository.getData()
}
    
    //I need a way to operate on the data that I get from repository
    
    }
 

Вызов ViewModel -> История репозитория получить данные->> ViewModel выполнить операцию с данными

Без какой-либо сторонней библиотеки .. только SDK для Android studio.

Комментарии:

1. Не могли бы вы предоставить более подробную информацию? С тем, что вы написали, было бы так же просто, как создать экземпляр репозитория в модели представления и выполнить вызовы методов

2. Серджио Пардо, Моя проблема не в вызове репозитория, а в том, чтобы получить данные из репозитория после завершения в viewmodel.

3. Вы имеете в виду асинхронную работу?

4. @SergioPardo После того, как репозиторий получит данные из веб-сервиса, я хочу передать эти данные для просмотра модели без использования каких-либо сторонних приложений, таких как Rx, сопрограммы и т. Д..

5. Понял, позвольте мне объяснить вам, как это сделать в качестве ответа

Ответ №1:

Вы можете использовать обратные вызовы, чтобы получать уведомления о выполнении работы. Способ сделать это-передать модель представления в качестве параметра методу, который будет выполнять эту работу. Я рекомендую вам определить интерфейс, чтобы репозиторий полагался не непосредственно на модель представления, а скорее на интерфейс.

Решение будет выглядеть примерно так:

 interface WebServiceCallback {
    fun onWebServiceSuccess(data: MyObject)
    fun onWebServiceError(error: MyError)
}

class MyViewModel: ViewModel(), WebServiceCallback {

    init {
        val repo = MyRepository()
        repo.getData(this)
    }

    override fun onWebServiceSuccess(data: MyObject) {
        //Implementation of what to do on success
    }

    override fun onWebServiceError(error: MyError) {
        //Implementation of what to do on failure
    }
}

class MyRepository { 
    fun getData(callback: WebServiceCallback) {
        //Do your service call however you have implemented it
        if(serviceResponse.isSuccess() == true) {
            callback.onWebServiceSuccess(serviceResponse.data)
        } else {
            callback.onWebServiceError(serviceResponse.error)
        }
    }
}
    
 

Это решение вызовет соответствующие методы в модели представления после завершения работы над репо. Надеюсь, этот ответ будет вам полезен.

Комментарии:

1. Очень хорошо, у меня есть еще один вопрос, я использую HttpURLConnection для получения данных из веб-сервиса, потому что, как я уже сказал, это должно быть решено без каких-либо сторонних разработчиков, так как я могу знать, что HttpURLConnection завершится и данные будут переданы успешно или с ошибкой ?

2. Я могу сослаться на эту документацию, так как она очень полная, она предназначена для реализации ПОСТА, но практически такая же, если вам нужна другая операция REST. wikihow.com/Execute-HTTP-POST-Requests-in-Android

3. Очень хорошо .. и очень спасибо, что я отнял у вас время, поэтому я приношу свои извинения и благодарю за ваши усилия

4. Могу ли я задать последний вопрос 😀 как я могу внедрить модель представления, репозиторий и любой класс без использования dagger или koin .. снова только с Android SDK ?

5. Извините за поздний ответ. В этом случае вам придется реализовать свою собственную инъекцию зависимостей, но вы не сможете использовать аннотации без необходимости разработки надежной библиотеки, подобной тем, которые вы упомянули. Я думаю, что самым простым способом добиться чего-то подобного было бы реализовать свой собственный локатор служб , это в основном одноэлементный модуль, в котором будут храниться все экземпляры ваших зависимостей, а затем у вас будет возможность создавать экземпляры всех ваших классов, если у вас есть модель представления, которая зависит от репозитория, вы вызовете экземпляр в том же локаторе служб.