gpt4 book ai didi

android - Volley Request 将之前的值设置为 TextView

转载 作者:行者123 更新时间:2023-11-30 01:04:03 25 4
gpt4 key购买 nike

我想了解 volley 在 android 中是如何使用的,所以在我的项目中,我从 http://uinames.com/api/?amount=1

在应用程序中,我有一个按钮调用函数来发出请求,然后将其设置为 TextView。同样出于调试目的,我记录了来自 url 的响应。单击按钮时,在 logcat 中可以正确看到响应,但直到下次单击按钮时,文本才会设置到 TextView。

这是 JsonObjectRequest 的代码

public String getName() {
JsonObjectRequest objectRequest = new JsonObjectRequest(Request.Method.GET,
URL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
full_name = response.getString(name) + " " + response.getString(last);
Log.d(TAG, full_name);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});
AppController.getInstance().addToRequestQueue(objectRequest, "");

return full_name;
}

以下是调用方法 getName() 的 MainActivity 中的代码

mButton = (Button) findViewById(R.id.btn);
mTextView = (TextView) findViewById(R.id.text);

final RequestClass newReq = new RequestClass();

mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
name = newReq.getName();
mTextView.setText(name);
}
});

最佳答案

调用函数 String getName() 时会发生以下情况:

  1. 构造了一个JsonObjectRequest,并将响应和错误监听器传递给请求。请注意,监听器只有在相应事件发生后才会执行。
  2. JsonObjectRequest 被添加到请求队列中,当线程池中的线程可用时执行。
  3. 到目前为止,full_name 变量还没有被触及,您返回分配给它的最后一个值(这就是为什么当您再次单击该按钮时,您会在 TextView 中得到一个名称) .
  4. 您的请求得到响应,并且在您的函数返回后调用监听器为 full_name 分配一个新值。这是您在下一次调用 getName() 时获得的值。 . .

一般来说,像getName 这样的函数不能执行网络操作并立即返回结果。它要么需要阻塞,直到它收到来自服务器的响应(这在 android 中是 prohibited)。或者,它可以在没有获取结果的情况下返回,并有一个回调函数(或监听器),当结果可用时调用该回调函数(这是 Volley 库中的通用方法)。

这意味着您必须在响应监听器中setText。我注意到您的网络请求有一个单独的类 RequestClass,要保持您的设计不变,一种解决方案是将监听器传递给 getName() 函数(以及在这个类中做网络工作的所有其他功能),它可能看起来像这样:

public void getName(Response.Listener<JSONObject> responseListener,
Response.ErrorListener errorListener) {
JsonObjectRequest objectRequest = new JsonObjectRequest(Request.Method.GET,
URL, null, responseListener, errorListener);
AppController.getInstance().addToRequestQueue(objectRequest, "");
}

在你的 Activity 中,你必须像这样传递听众:

mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
name = newReq.getName(
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
String full_name = response.getString("name") + " " + response.getString("last");
mTextView.setText(full_name);
Log.d(TAG, full_name);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
}

});

作为更好的设计,您可能希望避免从 Activity 中传递 Volley 监听器(它不必知道任何有关 volley 的信息),因此您可能希望定义您自己的监听器接口(interface),覆盖并将其从 Activity 传递到您的网络类(您在其中实例化您的 Response.ListenerResponse.ErrorListener 并覆盖它们以调用函数你的听众)。

关于android - Volley Request 将之前的值设置为 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39056711/

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