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

时间:2019-08-02 07:59:24

标签: java android generics kotlin android-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()函数,

2 个答案:

答案 0 :(得分:0)

使基类包含一个抽象方法,该方法返回名为Map<String, String>的{​​{1}}。此方法应将自身转换为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
}

答案 1 :(得分:0)

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

df1$count <-  with(df1, ave(ind* person, group, FUN = 
          function(x) length(unique(x[x!=0]))))
df1$count
#[1] 2 2 2 1 1 1

并使用它,如下所示:

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

感谢faranjit的回答和评论。