为了账号安全,请及时绑定邮箱和手机立即绑定

在 Volley 中发出发布请求的通用函数

在 Volley 中发出发布请求的通用函数

拉风的咖菲猫 2023-05-10 17:15:56
我致力于开发一个 android 应用程序,我想制作一个通用的 volley post 请求功能,我将我的功能编写如下: public fun <T> push(context: Context, url: String, myObject: T, completion: (response: String) -> Unit) {        val queue = Volley.newRequestQueue(context)        val sr = object : StringRequest(            Method.POST, url,            Response.Listener { response ->                println(response)                completion(response)            },            Response.ErrorListener { volleyError ->                Common.showVolleyError(volleyError, context)            }) {            override fun getParams(): Map<String, String> {                val params = myObject as HashMap<String, String>                return params            }            @Throws(AuthFailureError::class)            override fun getHeaders(): Map<String, String> {                val params = HashMap<String, String>()                params["Content-Type"] = "application/x-www-form-urlencoded"                params["X-Requested-With"] = "XMLHttpRequest"                return params            }        }        sr.retryPolicy = DefaultRetryPolicy(            0,            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT        )        queue.add(sr)    }我强制执行的是如何将我的可序列化对象转换为一个HashMap<String, String>(),即如何绑定myObject到getParams()函数,
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

最后,对于任何可能喜欢使用这种方式的人,我将函数重写如下:


public fun <T> push(context: Context, url: String, myObject: T,myObjectType : Array<Field>, completion: (response: String) -> Unit) {


    val myObjectAsDict = HashMap<String, String>()

    val allFields = myObjectType //:Array<Field> = myObjectType!!::class.java.declaredFields

    for ( field in allFields) {

        if (!field.isAccessible) {

            field.isAccessible = true

        }



        val value = field.get(myObject)

        if (value != null)

        {

            if( field.name != "serialVersionUID") {

                myObjectAsDict[field.name] = value.toString()

            }

        }

    }


    println(myObjectAsDict)


    val queue = Volley.newRequestQueue(context)

    val sr = object : StringRequest(

        Method.POST, url,

        Response.Listener { response ->

            println(response)

            completion(response)

        },

        Response.ErrorListener { volleyError ->

            Common.showVolleyError(volleyError, context)

        }) {


        override fun getParams(): Map<String, String> {

            val params = myObjectAsDict

            return params

        }


        @Throws(AuthFailureError::class)

        override fun getHeaders(): Map<String, String> {

            val params = HashMap<String, String>()

            params["Content-Type"] = "application/x-www-form-urlencoded"

            params["X-Requested-With"] = "XMLHttpRequest"

            return params

        }

    }


    sr.retryPolicy = DefaultRetryPolicy(

        0,

        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,

        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT

    )

    queue.add(sr)

}

并使用它如下:


 var myClass = MyClass()

        VolleyFunctions.push(this,"URL",myClass, MyClass::class.java.declaredFields)

        {

                response->

            myClass = Gson().fromJson(response, MyClass::class.java)

            println("myClass.Name${myClass.name}")

        } 


查看完整回答
反对 回复 2023-05-10
?
暮色呼如

TA贡献1853条经验 获得超9个赞

使基类包含一个抽象方法返回Map<String, String>命名为 example getConvertedParams。此方法应将自身转换为Map<String, String>:


val params = HashMap<String, String>()

params["attribute1"] = attribute1

params["attribute2"] = attribute2

...

return params

每个请求对象都应该扩展该基类并覆盖该方法。在getParams您发送请求的地方,调用getConvertedParams您的通用请求对象。


override fun getParams(): Map<String, String> {

   val params = myObject.getConvertedParams()

   return params

}

也不要忘记更改方法签名


public fun <BaseClassName> push(context: Context, url: String, myObject: BaseClassName, completion: (response: String) -> Unit)



查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信