好的,因此,我尝试使用Volley为RESTful服务器实现客户端。
我有IServerRequest
和IServerResponse
域对象。
我现在想编写一个IServerRequestVisitor
,将IServerRequest
转换为Volley
请求。
现在凌空抽空Request<ResponseType>
将使用NetworkResponse
并尝试将其解析为ResponseType
。然后,它需要一组两个侦听器:
Response.Listener<ResponseType>
,当请求成功解析响应时调用。
Response.ErrorListener
(如果没有)。
所以我的设想是:
我有一个
class VolleyRequestDispatcher(
private val context:Context
):IServerRequestVisitor<VolleyResponseListeners<IServerResponse>,Unit> {...}
实现IServerRequestVisitor
接口的。目前,只有一种类型的请求需要处理,但还需要添加更多类型。
interface IServerRequestVisitor<in Params, out ReturnType>{
fun visit(req: ILoginRequest, params:Params):ReturnType
}
我现在将两个侦听器封装到一个自定义类中,以便将它们作为参数传递给我的侦听器。
data class VolleyResponseListeners<ResponseType>(
/**Called IFF the corresponding [Request] succeeds in parsing its [Response]*/
val onResponse:Response.Listener<ResponseType>,
/**Called if there was an error parsing the [Response]*/
val onError: Response.ErrorListener
)
到目前为止,太好了。让我们实际创建一个
class VolleyLoginRequest(
serverURL:String,
private val loginRequest:ILoginRequest,
private val listener:Response.Listener<ILoginResponse>,
errorListener:Response.ErrorListener
): Request<ILoginResponse>(Method.POST,"$serverURL/login",errorListener){...}
但 ,如果我现在去VolleyRequestDispatcher
并写
override fun visit(req: ILoginRequest, params:VolleyResponseListeners<IServerResponse>){
val serverURL = WebConfig.getServerURL()
val request = VolleyLoginRequest(serverURL,req,params.onResponse,params.onError)
//dispatch the request
}
当我在params.onResponse
中指定我想要类型为Response.Listener<IServerResponse>
的侦听器时,AndroidStudio抱怨VolleyLoginRequest
的类型为Response.Listener<ILoginResponse>
。
现在显然,ILoginResponse
是IServerResponse
的子类型。因此,我认为我应该可以在适当的位置放置一些in
或out
来完成这项工作。
不过,到目前为止,我仍无法弄清楚那是哪里。
如果有人可以帮助我解决这个问题,将不胜感激。
(是的,我 am 知道我可以将VolleyLoginRequest
更改为要求Response.Listener<IServerResponse>
,然后希望客户进行进行类型检查并投放到侦听器中,但我不希望这样做。)