Я реализую приложение Android в Kotlin, которое использует API в качестве основного источника данных.Я использую Kotlin, RXjava, Retrofit и Dagger, чтобы заставить его работать.
Но по какой-то причине мой объект person в функции onNext пуст.Несмотря на то, что я вижу данные вызова метода http в Logcat, и в нем указан правильный объект person.
Я запрашиваю объект person из JSON:
{
"persons": [{
"personId": 1,
"personName": "Bert",
"personAge": 19,
"isFemale": "false",
"birthDate": "2000-06-28T00:00:00"
}
]
}
ApiInterface:
@GET("persons")
fun getPerson(@Query("personId") personId: Int): Observable<Person>
PersonRepository:
class PersonRepository @Inject constructor(val apiInterface: ApiInterface) {
fun getPerson(personId: Int): Observable<Person>{
return apiInterface.getPerson(personId)
}
}
Person ViewModel:
class PersonViewModel @Inject constructor(private val personRepositoy: PersonRepository) : ViewModel() {
var personResult: MutableLiveData<Person> = MutableLiveData()
var personError: MutableLiveData<String> = MutableLiveData()
lateinit var disposableObserver: DisposableObserver<Person>
fun personResult(): LiveData<Person> {
return personResult
}
fun personError(): LiveData<String> {
return personError
}
fun loadPerson(personId: Int) {
disposableObserver: object : DisposableObserver<Person>() {
override fun onComplete() {}
override fun onNext(person: Person){ //this is empty for some reason
personResult.postValue(person)
}
override fun onError(e: Throwable) {
personError.postValue(e.message)
}
}
personRepository.getPerson(personId)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(disposableObserver)
}
fun disposeElements() {
if(null !- disposableObserver && !disposableObserver.isDisposed) {
disposableObserver.dispose()
}
}
}
PersonActivity, где выполняется вызов:
@Inject
lateinit var personViewModelFactory: PersonViewModelFactory
lateinit var personViewModel: PersonViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_person)
AndroidInjection.inject(this)
personViewModel = ViewModelProviders.of(this, personViewModelFactory).get(PersonViewModel::class.java)
personViewModel.loadPerson(1)
personViewModel.personResult().observe(this, Observer<Person> {
//some code that uses it
}
}
Возвращается вызов getPersonправильный человек, которого я вижу в журналах, но он не публикует значение в personResult, как я хочу.Я не знаю почему.
Редактировать: добавлен класс Person по запросу.Обратите внимание, что @Json является эквивалентом @SerializedName от GSON от Moshi.
data class Person (
@Json(name = "personId")
val personId: Int,
@Json(name = "personName")
val name: String,
@Json(name = "personAge")
val age: Int,
@Json(name = "isFemale")
val isFemale: Boolean,
@Json(name = "birthDate")
val birthDate: GregorianCalendar
)