我正在开发一个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()
函数,
答案 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的回答和评论。