我是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
的内容,但我又回到了最初的问题:如何使widgetText
在apiController.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)
}
}
}