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