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

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

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

val path = "example_endpoint"
val params = JSONObject()
params.put("email", "[email protected]")
params.put("password", "barpass")

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



在我的窗口小部件代码中,我有一个辅助函数updateAppWidget,其中使用了上面的代码,并且可以成功查询API,但是最后我得到了 updateAppWidget块内{ response -> // Parse the result }函数中的大部分代码:
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行的重要性,并告诉我如何编写此代码以将逻辑提升到一个水平,这是否值得一会儿?

我注意到的直接问题是我无法在此块之外引用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()
        }
    }
}

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

最佳答案

前三行的含义是:将参数中的数据传递到某种类型的后端(服务器)。

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)
            }
        }
    }
}

并使用该界面来检索小部件文本:
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)
        }
    }
}

08-18 18:13