我试图从mySQL数据库和我的代码正确地采取数据。问题是,我有一个JsonObjectRequest和它的信息,我不能使用它。我的想法是使用变量来保存一些我需要的信息。像这样:
val queue=Volley.newRequestQueue(this)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,url,null,
{ response ->
emailGet = response.getString("email")
usernameGet = response.getString("name")
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
queue.add(jsonObjectRequest)
正如我所说,这里的问题是emailGet和usernameGet(在此代码块之前声明的变量)仅将值存储在JsonObjectRequest中,其中的变量为空。例子:
val queue=Volley.newRequestQueue(this)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,url,null,
{ response ->
emailGet = response.getString("email")
usernameGet = response.getString("name")
Toast.makeText(this, emailGet, Toast.LENGTH_LONG).show()
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
queue.add(jsonObjectRequest)
Toast.makeText(this, usernameGet, Toast.LENGTH_LONG).show()
这里Toast将只在屏幕上打印emailGet内容,因为它在JsonObjectRequest中,必须打印usernameGet值的Toast将不会这样做。
查找信息,我发现这个问题可能是因为这个函数是异步的,我在Java中找到了一个可能的解决方案,我试图将其转换为Kotlin。
val queue=Volley.newRequestQueue(this)
val future : RequestFuture<JSONObject> = RequestFuture.newFuture()
val request = JsonObjectRequest(
Request.Method.GET, url, null, future, future)
queue.add(request)
try{
var response = future.get()
} catch (e : InterruptedException){
} catch (e : ExecutionException){
}
我真的不明白这第二段代码,但它仍然不起作用,响应变量总是空的,程序在其中保持无限循环。
如果你想使用emailGet
和usernameGet
变量,你应该在回调中做:
val queue = Volley.newRequestQueue(this)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET, url, null,
{ response ->
emailGet = response.getString("email")
usernameGet = response.getString("name")
// TODO do something with the variables here
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
queue.add(jsonObjectRequest)
如果相反,你有一个方法方法doSomething()
,在收到响应后立即运行:
fun doSomething(email:String, username:String){
// TODO do something with the variables here
}
您可以将第一个代码片段中的TODO注释替换为doSomething(emailGet, usernameGet)
。
JsonObjectRequest
的第4和第5个参数实际上是Response.Listener
和Response.ErrorListener
类型的对象。这两个监听器是单个抽象方法接口。如果展开,它看起来像这样:
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET, url, null,
object : Response.Listener {
override fun onResponse(response: JSONObject) {
emailGet = response.getString("email")
usernameGet = response.getString("name")
doSomething(emailGet, usernameGet)
}
},
object : Response.ErrorListener {
override fun onErrorResponse(error: VolleyError) {
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
}
)
您使用的lambda语法是SAM接口的简写。
最简单的方法是使用@ttyip的答案,但您也可以使用实时数据并观察它!你正在调用一个异步方法,会有一些延迟(网络API调用,这个延迟取决于用户的互联网连接等),所以首先你需要在你的项目中添加jetPack的生命周期组件:
dependencies {
def lifecycle_version = "2.4.0-alpha02"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// Annotation processor
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
}
同步项目后,在activity/fragment中定义global:
val email: MutableLiveData<String> = MutableLiveData<String>()
val username: MutableLiveData<String> = MutableLiveData<String>()
在你的回复中:
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,url,null,
{ response ->
val emailGet = response.getString("email")
val usernameGet = response.getString("name")
email.postValue(emailGet)
username.postValue(usernameGet)
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
在activity的某个地方观察你的livedata:
email.observe(this, Observer { string ->
// Do some work
})
username.observe(this, Observer { string ->
// Do some work
})