如何在这里使用lambda表达式?

问题描述 投票:1回答:2

我有自定义的GetVolley类

class GetVolley(private val mContext: Context, private val url: String, private val onVolleySuccess: OnVolleySuccess?, private val mOnVolleyError: OnVolleyError?, private val mOnVolleyEnd: OnVolleyEnd?) {
    private fun getDataVolley() {
        Log.d("GetVolleyUrl", url)
        val request = JsonObjectRequest(Request.Method.GET, url, null, Response.Listener { response: JSONObject ->
            Log.d("GetVolleyResult", response.toString())
            if (response.has("result") && response.getBoolean("result")) {
                onVolleySuccess?.onSuccess(response)
            } else if (response.has("message")) {
                if (mOnVolleyError != null) mOnVolleyError.onError(response.getString("message"))
                else Toast.makeText(mContext, response.getString("message"), Toast.LENGTH_LONG).show()
            }
            mOnVolleyEnd?.onEnd()
        }, Response.ErrorListener { volleyError: VolleyError ->
            Log.d("GetVolleyError", volleyError.message.toString())
            val errorMessage: String = if (volleyError is NetworkError || volleyError is AuthFailureError) {
                "No Internet…"
            } else {
                "Undefinded error"
            }
            if (mOnVolleyError != null) mOnVolleyError.onError(errorMessage)
            else Toast.makeText(mContext, errorMessage, Toast.LENGTH_LONG).show()
            mOnVolleyEnd?.onEnd()
        })
        Volley.newRequestQueue(mContext).add(request)
    }

    init {
        getDataVolley()
    }
}

不同文件中的接口:

interface OnVolleySuccess {
    fun onSuccess(response: JSONObject)
}
______________________________________
interface OnVolleyError {
    fun onError(error: String)
}
______________________________________
interface OnVolleyEnd {
    fun onEnd()
}

[当我使用自定义GetVolley请求时。我的代码如下:

GetVolley(this, url, object : OnVolleySuccess {
    override fun onSuccess(response: JSONObject) {
        parseResponse(response)
    }
}, object : OnVolleyError {
    override fun onError(error: String) {
        showError(error)
    }
}, null)

我希望它看起来像这样:

GetVolley(this, url, response -> {
    parseResponse(response)
}, error -> {
    showError(error)
}, null)

我所有的回调都是可为空的,因此我可以将null设置为onVolleySuccess,onVolleyError,onVolleyEnd。

kotlin lambda android-volley
2个回答
2
投票
您所说的SAM conversions(单一抽象方法)。它仅适用于Java接口,但自Kotlin 1.4起可用于Kotlin接口。 (请参阅this article)。现在,如果您想要lambda,请使用lambda ::>

class GetVolley( private val mContext: Context, private val url: String, private val onVolleySuccess: ((response: JSONObject) -> Unit)?, private val mOnVolleyError: ((error: String) -> Unit)?, private val mOnVolleyEnd: (() -> Unit)? ) {

而不是做:

onVolleySuccess?.onSuccess(response)

您愿意:

onVolleySuccess?.invoke(response)


1
投票

注意:如果需要,请使用Nicolas解决方案,因为如果您不想在Java中使用这些类,它会在本地使用lambda。[SAM转换,即使用lambda进行回调转换的接口仅在EAP(早期访问程序)中的Kotlin 1.4以后可用。

© www.soinside.com 2019 - 2024. All rights reserved.