项目场景:
在我尝试编写一个安卓登录模块的逻辑并测试时,我发现程序报错。报错原因竟是Gson这个第三方引起的异常。
问题描述
这是我的登录代码的一部分实列:
loginBt.setOnClickListener {
//登录按钮点击登录
//api为Retrofit代理的接口实列
api.login(
createBody(//post数据
mapOf(
//accTil是TextInputLayout,内包裹一个EditText
Pair("username", accTil.editText?.text!!),
Pair("password", passTil.editText?.text!!)
)
)
).enqueue(ICallBack {
//登录后的逻辑
if (it.code == 200){
App.sp.edit()
.putString("token", it.token)
.apply()
migrateTo(MainActivity::class.java)
this@LoginActivity.finish()
}else{
}
})
}
/**
* 获取一个RequestBody
* @param map post数据
*/
protected fun createBody(map: Map<String, Any>): RequestBody {
return RequestBody.create(
"application/json;charset=utf-8".toMediaTypeOrNull(),
Gson().toJson(map)
)
}
原因分析:
我大意了,没有闪
众所周知,想要获取TextView的字面值只需要调用getText()
方法即可。由于EditText是继承于TextView,自然EditText也拥有同样的方法。但是EditText重写了这个方法。如下:
public class EditText extends TextView {
@Override
public Editable getText() {
CharSequence text = super.getText();
// This can only happen during construction.
if (text == null) {
return null;
}
if (text instanceof Editable) {
return (Editable) super.getText();
}
super.setText(text, BufferType.EDITABLE);
return (Editable) super.getText();
}
}
如你所见,这个方法不再返回一个String,而是返回一个Editable。
当使用EditText.getText()
时,其实它返回的并不是一个字符串,而是一个对象。Gson在将这个对象转换时,由于其不是基本类型,自然就会报错。
解决方案:
仅需要在 getText() 后再调用 .toString() 方法即可
例如:
mapOf(
Pair("username", accTil.editText?.text!!.toString()),
Pair("password", passTil.editText?.text!!.toString())
)
后记:在编写kotlin时,由于有自动类型推导,还请一定小心变量类型的把控!
更多关于:
Editable
: CSDN 文章分享 : Android Editable