现在kotlin 已经慢慢替代java了,我在用kotlin编写项目中遇到一个问题,即在使用Rxjava+Retrofit2库网络请求的时候出现一个问题。
因为后台的数据类型肯定是java类型,所以boolean是java类型,但是因为我们前端是在kotlin中使用retrofit,所以我们会使用如下写法。
接口写法
@FormUrlEncoded
@POST("phone/sysapi/user/checkuser.p")
fun checkUser(@Field("phoneNumber") mobile: String): Observable<BaseEntity<Boolean>>
请求写法
RetrofitFactory.API.checkUser(login_et_input!!.text.toString())
.io_main().subscribe(object : BaseObserver<Boolean>() {
override fun onSuccees(t: BaseEntity<Boolean>) {
if (t.data) {
val map = HashMap<String, String>()
map["phoneNumber"] =
PhoneEditText.getPhoneText(login_et_input!!.text.toString())
.toString()
loginPresenter!!.getcode(this@PrepareLoginActivity, map)
} else {
startActivity(
Intent(
this@PrepareLoginActivity,
LoginByPasswordActivity::class.java
)
)
}
}
})
当我们调试的时候发现,t.data是空。这是因为这两个类型有点不一致。具体可以看下面的一篇博客。
Kotlin 调用Java写的方法,参数Class 神坑
弄了好久之后,才发现需要在kotlin中调用java的类型。
正确写法如下,希望帮到大家。
RetrofitFactory.API.checkUser(login_et_input!!.text.toString())
.io_main().subscribe(object : BaseObserver<Boolean>() {
override fun onSuccees(t: BaseEntity<Boolean>) {
if (!Boolean::class.javaObjectType.isInstance(t.data)) {
val map = HashMap<String, String>()
map["phoneNumber"] =
PhoneEditText.getPhoneText(login_et_input!!.text.toString())
.toString()
loginPresenter!!.getcode(this@PrepareLoginActivity, map)
} else {
startActivity(
Intent(
this@PrepareLoginActivity,
LoginByPasswordActivity::class.java
)
)
}
}
})