首页 > 解决方案 > 如何使用 Kotlin 实现 volleyresponse 监听器

问题描述

我正在尝试将我的凌空请求移动到一个类中,这样我就可以将它用于多个网络调用。我需要一种方法来访问我在此类中使用的任何活动中的响应侦听器。我在java中看到了一些例子,但我发现很难做到这一点。

import android.content.Context
import com.android.volley.DefaultRetryPolicy
import com.android.volley.Request
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley

interface VolleyResponse{
}

class NetworkCall(LINK:String, 
                  CONTEXT:Context, 
                  CACHE:Boolean, 
                  PARAMS: HashMap<String, String> = HashMap(),
                  SuccessListener: Response.Listener<String>,
                  ErrorListener: Response.ErrorListener ) {

    private  var link:String = LINK
    private var context: Context = CONTEXT
    var cache: Boolean = CACHE
    var PARAMS: HashMap<String,String> = HashMap()

    fun RunTask( ){
        //BUILD the request and listen for error or success
        var request = object : StringRequest(
                Request.Method.POST,link,
                Response.Listener { response -> { }
                },
                Response.ErrorListener { error -> { }
                }) {
            override fun getParams(): HashMap<String, String> {
                return PARAMS
            }
        }
        var RequestQueue: RequestQueue = Volley.newRequestQueue(context)
        request.setShouldCache(cache)
        request.setRetryPolicy(DefaultRetryPolicy(10000, 0, 0F))
    }
}

我这样称呼它...

 fun processLogin() {
        var params:HashMap<String,String> = HashMap()
        params.put("user_email","username")
        params.put("user_password","password")
        var networkCall = NetworkCall("",applicationContext,false,params)
}

我只需要能够访问我的 processLogin 函数中的响应侦听器。

标签: kotlinandroid-volley

解决方案


首先,您必须在定义的地方定义实现Response.Listener<String>,这可以按以下方式完成Response.ErrorListenerclassprocessLogin

private val successListener = Response.Listener<String> {
    // Do something when response is received
}

private val errorListener = Response.ErrorListener {
    // Do something when error is received
}

processLogin现在,当您按以下方式调用时,将这些作为参数传递

 var networkCall = NetworkCall("",applicationContext,false,params, successListener, errorListener)

最后,您需要更新您的NetworkCall类,以便在网络操作中调用这些侦听器

fun RunTask( ){
    //BUILD the request and listen for error or success
    var request = object : StringRequest(
        Request.Method.POST,link,
        SuccessListener,  // Pass listeners to request
        ErrorListener) {
        override fun getParams(): HashMap<String, String> {
            return PARAMS
        }
    }

推荐阅读