com.google.gson.internal.bind.ReflectiveTypeAdapterFactory

项目场景:

在我尝试编写一个安卓登录模块的逻辑并测试时,我发现程序报错。报错原因竟是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时,由于有自动类型推导,还请一定小心变量类型的把控!

更多关于:

猜你喜欢

转载自blog.csdn.net/qq_49757305/article/details/127948671