繁体   English   中英

在Volley中发出后期请求的泛型函数

[英]Generic function to make post request in Volley

我正在开发一个Android应用程序,我想做一个齐射后请求的通用函数,我将函数写为波纹管:

 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()函数,

使一个包含抽象方法的基类返回Map<String, String> ,例如Map<String, String>命名为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)

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

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}")
        } 

感谢faranjit的回答和您的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM