Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin RxJava改型-空可处置观察者LiveData_Android_Kotlin_Retrofit_Rx Java_Android Livedata - Fatal编程技术网

Android Kotlin RxJava改型-空可处置观察者LiveData

Android Kotlin RxJava改型-空可处置观察者LiveData,android,kotlin,retrofit,rx-java,android-livedata,Android,Kotlin,Retrofit,Rx Java,Android Livedata,我正在Kotlin中实现一个Android应用程序,它使用API作为数据的主要来源。我使用Kotlin、RXjava、改装和Dagger使其工作 但由于某种原因,onNext函数中的person对象为空。即使我在Logcat中看到http方法调用数据,并且它具有正确的person对象 我正在从JSON请求person对象: { "persons": [{ "personId": 1, "personName": "Bert", "personAge": 1

我正在Kotlin中实现一个Android应用程序,它使用API作为数据的主要来源。我使用Kotlin、RXjava、改装和Dagger使其工作

但由于某种原因,onNext函数中的person对象为空。即使我在Logcat中看到http方法调用数据,并且它具有正确的person对象

我正在从JSON请求person对象:

{
  "persons": [{
      "personId": 1,
      "personName": "Bert",
      "personAge": 19,
      "isFemale": "false",
      "birthDate": "2000-06-28T00:00:00"
    }
  ]
}
API接口:

@GET("persons")
fun getPerson(@Query("personId") personId: Int): Observable<Person>

为了避免JSON响应与要使用的实际对象之间不匹配,请定义一个类似以下内容的中间类:

data class PersonResponse(
      @Json(name = "persons")
      val persons: List<Person>
)
数据类PersonResponse(
@Json(name=“persons”)
val人员:名单
)
api类示例:

@GET("persons")
fun getPerson(@Query("personId") personId: Int): Observable<PersonResponse>    

@GET("persons")
fun getAllPersons(): Observable<PersonResponse>
@GET(“个人”)
fun getPerson(@Query(“personId”)personId:Int):可观察
@获取(“人”)
有趣的getAllPersons():可观察
示例存储库类:

fun getPerson(personId: Int): Observable<Person>{
    // Convert PersonResponse -> Person
    return apiInterface.getPerson(personId)
        .doOnNext { value -> Log.d(SOME_LOG_TAG, "onNext: value=$value") }
        .doOnError { error -> Log.d(SOME_LOG_TAG, "onNext: value=${e.getMessage()}") }
        .flatMap { response ->
            // Check if the list contains exactly one Person and throw error if it doesn't
            if (response.persons.size == 1) 
                Observable.just(response.persons[0])
            else
                Observable.error(Throwable("Something's wrong"))
        }
}


fun getAllPerson(): Observable<List<Person>> {
    // Convert PersonResponse -> List<Person>
    return apiInterface.getAllPersons()
        .map { response -> response.persons }
}
fun-getPerson(personId:Int):可观察{
//转换PersonResponse->Person
返回apinterface.getPerson(personId)
.doOnNext{value->Log.d(一些日志标记,“onNext:value=$value”)}
.doError{error->Log.d(一些日志标记,“onNext:value=${e.getMessage()}”)}
.flatMap{响应->
//检查列表是否只包含一个人,如果不包含,则抛出错误
如果(response.persons.size==1)
可观察。仅(response.persons[0])
其他的
可观察到的错误(可丢弃(“出错”))
}
}
fun getAllPerson():可观察{
//转换PersonResponse->List
返回apinterface.getAllPersons()
.map{response->response.persons}
}

正如您所看到的,存储库代码看起来非常混乱。我建议在api类和repository类之间建立一个中间层,完成所有转换。

我认为这是因为您没有调用初始化disposableObserver的方法。@p.mathew13不,我确实在活动中调用了,但我不认为添加它与问题相关,Dagger也一样,但我会添加它。@Walt,JSON响应看起来像是返回一个person对象列表。你的
Person
定义真的解释了这一点吗?@SanlokLee personId是唯一的,所以我应该只得到一个Person对象。你是不是建议我收到一个包含1个对象的列表?是的。我试图指出,您的JSON响应具有“persons:a list of persons”表单。您的响应返回一个
Person
列表,列表中有一个对象,而您的响应需要一个
Person
对象本身,因此存在类型不匹配。当然,除非您的
Person
定义看起来像
Person(val persons:List)
。你能带你的
人去看看吗?@Walt,谢谢你发现了。您只需删除
flatMap()
中的“return”,不幸的是personResult.postValue(person)仍然为空,尽管我可以在logcat中看到调用成功,并且没有看到任何错误。可能是因为它不知道如何将ISO 8601日期格式转换为GregoriaCalendar?虽然我已经为它写了一个转换器,但可能它没有完全工作,因此没有初始化数据?但是不确定这是否有意义,因为
人的列表可以工作。您可以登录
flatMap()
并查看
response
是否为null或
response.Persons.size
是否为1?我应该如何记录它,我在调试器中看不到它。不确定您的意思是在调试器中看不到它。这是否意味着没有记录任何内容?我用一个示例代码更新了答案,但只需将
Log.d(…)
放在
flatMap()中也可以。
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

)
data class PersonResponse(
      @Json(name = "persons")
      val persons: List<Person>
)
@GET("persons")
fun getPerson(@Query("personId") personId: Int): Observable<PersonResponse>    

@GET("persons")
fun getAllPersons(): Observable<PersonResponse>
fun getPerson(personId: Int): Observable<Person>{
    // Convert PersonResponse -> Person
    return apiInterface.getPerson(personId)
        .doOnNext { value -> Log.d(SOME_LOG_TAG, "onNext: value=$value") }
        .doOnError { error -> Log.d(SOME_LOG_TAG, "onNext: value=${e.getMessage()}") }
        .flatMap { response ->
            // Check if the list contains exactly one Person and throw error if it doesn't
            if (response.persons.size == 1) 
                Observable.just(response.persons[0])
            else
                Observable.error(Throwable("Something's wrong"))
        }
}


fun getAllPerson(): Observable<List<Person>> {
    // Convert PersonResponse -> List<Person>
    return apiInterface.getAllPersons()
        .map { response -> response.persons }
}