我如何在这里使用 lambda 表达式?
How can I use lambda expression here?
我有我的自定义 GetVolley Class
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)
我所有的回调都可以为空,所以我可以将 onVolleySuccess、onVolleyError、onVolleyEnd 设置为空。
注意:如果你愿意,可以使用 Nicolas 解决方案,因为如果你不想在 Java[ 中使用这些 类,它会在本地使用 lambda =15=]
SAM 转换,即使用 lambda 的接口到回调转换仅在 Kotlin 1.4 之后可用,它在 EAP(抢先体验计划)中。
如果您的 Kotlin 1.4-M1 是几个月前发布的,您可以使用 fun
关键字声明您的接口,这将使其可用作 lambda。
fun interface OnVolleySuccess {
fun onSuccess(response: JSONObject)
}
fun interface OnVolleyError {
fun onError(error: String)
}
fun interface OnVolleyEnd {
fun onEnd()
}
现在你可以这样使用了:
GetVolley(this, url, { response ->
parseResponse(response)
}, { error ->
showError(error)
}, null)
// or simply
GetVolley(this, url, { parseResponse(it) }, { showError(it) }, null)
如果您在采用 Kotlin 1.4 时遇到困难,请注意:
// add/change these in build.gradle:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4-M1'
// ...
}
repositories {
// ...
maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
}
// add these in settings.gradle
pluginManagement {
repositories {
mavenCentral()
maven { "https://dl.bintray.com/kotlin/kotlin-eap" }
maven { "https://plugins.gradle.org/m2/" }
}
}
什么叫什么SAM conversions (Single Abstract Method). It's only available to Java interfaces, but will be available to Kotlin interface from Kotlin 1.4. (see 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)
我有我的自定义 GetVolley Class
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)
我所有的回调都可以为空,所以我可以将 onVolleySuccess、onVolleyError、onVolleyEnd 设置为空。
注意:如果你愿意,可以使用 Nicolas 解决方案,因为如果你不想在 Java[ 中使用这些 类,它会在本地使用 lambda =15=]
SAM 转换,即使用 lambda 的接口到回调转换仅在 Kotlin 1.4 之后可用,它在 EAP(抢先体验计划)中。
如果您的 Kotlin 1.4-M1 是几个月前发布的,您可以使用 fun
关键字声明您的接口,这将使其可用作 lambda。
fun interface OnVolleySuccess {
fun onSuccess(response: JSONObject)
}
fun interface OnVolleyError {
fun onError(error: String)
}
fun interface OnVolleyEnd {
fun onEnd()
}
现在你可以这样使用了:
GetVolley(this, url, { response ->
parseResponse(response)
}, { error ->
showError(error)
}, null)
// or simply
GetVolley(this, url, { parseResponse(it) }, { showError(it) }, null)
如果您在采用 Kotlin 1.4 时遇到困难,请注意:
// add/change these in build.gradle:
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.4-M1'
// ...
}
repositories {
// ...
maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
}
// add these in settings.gradle
pluginManagement {
repositories {
mavenCentral()
maven { "https://dl.bintray.com/kotlin/kotlin-eap" }
maven { "https://plugins.gradle.org/m2/" }
}
}
什么叫什么SAM conversions (Single Abstract Method). It's only available to Java interfaces, but will be available to Kotlin interface from Kotlin 1.4. (see 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)