gpt4 book ai didi

android - 解释这个基本的 Kotlin 函数

转载 作者:行者123 更新时间:2023-11-29 23:25:31 33 4
gpt4 key购买 nike

我是 Java/Kotlin 的新手,正在处理这个 tutorial构建一个带有小部件的 Android 应用程序,该小部件可以从 URL 查询一些 JSON 并呈现所述结果。

我对最后一个代码示例感到困惑:

val service = ServiceVolley()
val apiController = APIController(service)

val path = "example_endpoint"
val params = JSONObject()
params.put("email", "foo@email.com")
params.put("password", "barpass")

apiController.post(path, params) { response ->
// Parse the result
}

As usual in Kotlin, if the last parameter to a function is a function (and you're passing a lambda expression as the corresponding argument), you can specify it outside of parentheses, as we’ve done above — one of the small quirks I love about Kotlin.

在我的小部件代码中,我有一个辅助函数 updateAppWidget,我在其中使用了上面的代码,并且可以成功查询 API,但是我最终得到了updateAppWidget 函数 { response ->//解析结果 } block 中:

apiController.post(path,params) { response ->
// Get 'bar' from the response which is {'foo':'bar'}
val widgetText = response?.get(response.names().getString(0)).toString()

// Construct the RemoteViews object
val views = RemoteViews(context.packageName, R.layout.statusr)
views.setTextViewText(R.id.appwidget_text, widgetText)

// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views)
}

谁能解释一下第一个代码块的最后 3 行的意义,并告诉我如何编写它来将逻辑提升一个层次,这是否值得?

我注意到的直接问题是我无法在这个 block 之外引用 widgetText。

为清楚起见编辑

我想我是在我的头上。进一步阅读表明我正在使用 -> 传递 lambda???我想我真正想做的是:

完全从小部件代码中获取对 apiController.post 的调用,所以我现在将其放在一个单独的类中:

class GetData {

fun widget_text(){
val service = ServiceVolley()
val apiController = APIController(service)

val path = "endpoint"
val params = JSONObject()

params.put("some", "data")

apiController.post(path, params) { response ->
val widgetText = response?.get(response.names().getString(0)).toString()
}
}
}

希望能够从 updateAppWidget 中调用类似 GetData.widget_text() 的东西,但我又回到了我最初的问题:我如何制作 >widgetTextapiController.post(path,params) { response ->//Logic }} 之外可用并返回它。

最佳答案

前三行的意思:params中的数据被传递给某种类型的后端(服务器)。

apiController.post(path, params) { response ->
val widgetText = response?.get(response.names().getString(0)).toString()
// Display the result in the App Widget
}

请求是异步执行的。这意味着,lambda 表达式中的代码将在服务器响应到达后运行,而应用程序的 UI 将保持可点击状态。启动后端调用的方法将完成(如果它必须等到 UI 中的响应可能会卡住)。

一个可能的应用程序结构使用 GetData 作为管理后端调用的类:

class GetData {
interface WidgetTextCallback {
fun onTextLoaded(text: String)
}

companion object {
fun widget_text(callback: WidgetTextCallback) {
val service = ServiceVolley()
val apiController = APIController(service)

val path = "endpoint"
val params = JSONObject()

params.put("some", "data")

apiController.post(path, params) { response ->
val widgetText = response?.get(response.names().getString(0)).toString()
callback.onTextLoaded(widgetText)
}
}
}
}

并使用接口(interface)检索小部件文本:

class NewAppWidget : AppWidgetProvider() {

override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {

GetData.widget_text(object: GetData.WidgetTextCallback{
override fun onTextLoaded(widgetText: String) {
// There may be multiple widgets active, so update all of them
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, widgetText, appWidgetManager, appWidgetId)
}
}
})
}

companion object {

internal fun updateAppWidget(context: Context, widgetText: String, appWidgetManager: AppWidgetManager,
appWidgetId: Int) {
// Construct the RemoteViews object
val views = RemoteViews(context.packageName, R.layout.new_app_widget)
views.setTextViewText(R.id.appwidget_text, widgetText)

// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
}

关于android - 解释这个基本的 Kotlin 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53658883/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com