- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何从 public void onResponse 函数中获取响应?
编辑:我收到解析错误:“无法为最终变量“res”赋值”
public JSONObject getRestRequest() {
final JSONObject res;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, this.restPath, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) { // basically I just want to return this response
res = response;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}
);
return res;
}
}
最佳答案
您不能完全按照您所写的那样执行此操作,因为网络请求发生在单独的线程上。
首先,让我们浏览一下您的代码,以便您清楚发生了什么:
public JSONObject getRestRequest() { // 1 - your method is invoked by another method and control starts here
final JSONObject res; // 2 - This final (i.e. immutable) field is created
// 3 - You create a new request object - no networking is happening yet
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, this.restPath, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) { // basically I just want to return this response
// 5 - Some time later, after the request completes, this method is invoked
// BUT - you can't assign to res because it's final (immutable)
res = response;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}
);
// 4 - IMMEDIATELY after creating "request", the value that was created in step 2 (which is null) is returned
return res;
}
因此,您尝试同步执行异步操作(启动线程以发出网络请求并解析响应)(阻塞直到完成返回结果)。
所以这就是你的问题。要解决这个问题,您有两种选择:
1 - 使用异步回调:
public void getRestRequest(final Callback<JSONObject> callback) { // 1 - your method is invoked by another method and control starts here
// Now you're passing in a callback that will be invoked later with the result
// final JSONObject res; // 2 - You no longer need this local variable
// 3 - You create a new request object - no networking is happening yet
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, this.restPath, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) { // basically I just want to return this response
// 5 - Some time later, after the request completes, this method is invoked
// This time, you invoke your callback with the result
callback.onSuccess(response)
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
// 6 - You can also pass back errors to your callback
callback.onError(error);
}
}
);
// 4 - You return IMMEDIATELY after creating "request"
}
这种方法比较常见。您创建回调,将其传递给函数,然后处理响应:
// 1 - Start showing some UI that a request is happening
showProgressDialog();
// 2 - A new callback to handle the network response is created - no request is happening yet
Callback<JSONObject> callback = new Callback<>() {
public void onSuccess(JSONObject response) {
// 4 - Some time later, when the network response finishes, this called
// Handle response
dismissProgressDialog(); // Back on the main thread, so safe to update the UI
}
public void onError(VolleyError error) {
// 5 - Or this is called if the request failed
// Handle error
dismissProgressDialog(); // Back on the main thread, so safe to update the UI
}
}
// 3 - Invoke the network request which will happen in a background thread.
// Meanwhile, the main (UI) thread is not blocked and the progress dialog continues to spin
network.getRestRequest(callback)
选项 2 - 使用 RequestFuture .
public JSONObject getRestRequest() { // 1 - your method is invoked by another method and control starts here
// 2 - Initialize a Future to use to synchronously get the result
RequestFuture<JSONObject> future = RequestFuture.newFuture();
// 3 - You create a new request object with the future as the listener - no networking is happening yet
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, this.restPath, future, future);
// 4 - You return the value the future will obtain by making the network request
// THIS IS A BLOCKING CALL SO DON'T DO THIS ON THE MAIN THREAD
// This will also throw an exception if it fails
return future.get();
}
现在你可以得到你最初想要的结果了:
...
JSONObject response = network.getRestRequest()
...
但是您不能在主(UI)线程上执行此操作(如果您尝试在主线程上进行网络连接,Android 会抛出异常。但是如果您已经在单独的线程上进行工作,这样就可以了。
希望有帮助!
关于java - 有没有办法从 "onResponse"函数接收响应对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54114163/
我在一个模型中进行网络操作然后返回结果,但是当我返回它时数组列表大小为零但在 onResponse 方法中数组列表大小不为零。如何解决? public class doInBackgrou
我正在做一个基本的 Android 应用程序,它通过 API 执行简单的登录。我需要返回接收到的数据,但改进的 onResponse 方法具有 void 返回类型。我的代码是: package com
基本上这是代码结构,我想知道如何修改我的代码,以便我可以获取 onResponse 内的值并返回它。截至目前,我的 mainReply 变量返回“(空白)”,但我希望它传递数组列表中的数据,称为 on
如何从 public void onResponse 函数中获取响应? 编辑:我收到解析错误:“无法为最终变量“res”赋值” public JSONObject getRestRequest() {
我有这个方法 private void setNews(final GetDataCallback getDataCallback){ GetDataService service = Re
我正在使用 volley 加载 JSON 数据。 这是MainActivity public class MainActivity extends AppCompatActivity
我的 Activity 中名为 AllStores 的列表仅包含 null。我需要这个列表,因为我想稍后填充我的 ListView。导致问题的原因是我的回调最后执行。 为了澄清,我制作了下面的屏幕截图
我有一个点击监听器,在该点击监听器中,我有一个 if, else 语句,如下所示 @Override public void onClick(View v) {
基本上在我的Android应用程序中,我希望用户搜索世界各地的城市,因此我使用API来获取世界上所有的城市并将其存储在ArrayList中,这是在okhttp 库的 onResponse 方法,之
我的JSON: { "status": "1", "login": "sucess" } 这是我的模型类: public class LoginModel { @SerializedN
我正在使用 Retrofit 2.1.0 库,并使用 call.enqueue 方法进行异步 API 调用。 CallBack 类返回onResponse(Call call, Response re
请让我知道我需要在哪里使用 Volley 在 C# 中编写“OnResponse”。 我将代码从 Android Studio 转换为使用 Volley 库的 C#。然后我在 Xamarin 中打开代
我想从 BDDRequest 类获取变量“response”,以便在我的 MainActivity 类的 ListView 中使用它,我该怎么做? public class BDDRequest im
我是 Android 开发的新手,我正在尝试使用 OkHttp 和 GSon 从 DarkSky API 获取 json 数据。问题是我需要以某种方式从 onResponse 方法返回响应,但它始终为
我有两个类,它们将使用一个调用 Volley 并重写 onResponse 的类。除了两行之外,onReponse 中的代码将完全相同。基本上在响应上调用 super 但仍然执行额外的两行的最佳方法是
我正在使用 RetroFit 创建一个应用程序。我从 URL 获取 JSON 字符串数据,并使用 RetroFit 将其填充到回收 View 中。 我的问题 我的问题是,当应用程序执行时,它显示以下错
我想要一个ArrayList从我的改造回调并将其保存为 ArrayList我的类(class)中的变量。换句话说,我需要使用 retrofitList 中的数据即使我离开onResponse方法。最好
我正在使用 Volley StringRequest 使用以下代码对 Web 服务进行 GET 调用。 ArrayList> list; StringRequest getRequest = new
我正在处理 mvvm 设计,但 OnResponse 没有将数据保存在列表中。返回空列表数组。我无法达到有值(value)的列表。我真的不知道错误的代码在哪里。这是代码。请帮忙。 public cla
我需要一点帮助:) 我在我的 Android 应用程序上使用 volley,并且我编写了这段代码。 public String validateCredentials(final String
我是一名优秀的程序员,十分优秀!