java - 接收到 volley 响应后执行该方法

标签 java android android-volley

当我运行下面的代码时, 我在日志中得到“空白”,而我希望将它的“volleyResult”设置为 volley 请求生成的响应。

但是,当我第二次运行相同的代码时,它显示正确。

那么,如何在 'courses' 方法中保持 "Log.i(--)"直到 volleyResult 到达。

我有几种方法,就像“类(class)”一样,它们之间的唯一区别是它们调用的 URL。 此外,它们都充当“OnButtonClickListner”,因此不能在“req”中调用“courses”。

    String volleyResult = "blank";

    public void courses(View view) {
        String url = "http://courses/list.json";
        reqReturn(url, "Courses");
        Log.i("Volley Res", volleyResult);    
    }


    public void req(String url, final String type ) {

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    volleyResult = response;
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            volleyResult = "error";
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Cookie", cookie);
            return headers;
        }
    };
    queue.add(stringRequest);

    }

最佳答案

在 onResponse() 中调用 courses()

编辑澄清:

您在 Response.Listener 中填充 var volleyResult。这是异步的,所需时间取决于服务器延迟和您的互联网连接。有几种方法可以“保留”出需要 volleyResult 中的结果的处理方法。

最简单的方法: 在将响应存储在 volleyResult 中之后,在 onResponse 方法中移动进程(在您的例子中是 Log.i("Volley Res", volleyResult);

更简洁一点: 将您的代码移动到一个新函数中并从您的 Response.Listener 方法中调用它:

@Override
public void onResponse(String response) {
  volleyResult = response;
  methodToHoldUntilResponseArrived();
}

public void methodToHoldUntilResponseArrived(){
  // your code that relies on the volley response
  Log.i("Volley Res", volleyResult);
}

万一你的 courses 方法被重复调用:你可以在接收到数据时设置一个标志,并将你的代码放在 if-condition block 中的 courses() 中:

private boolean mHasReceivedData = false;
@Override
public void onResponse(String response) {
  volleyResult = response;
  mHasReceivedData = true;
}

public void courses(View view){
  // your code that relies on the volley response
  if(mHasReceivedData){
        Log.i("Volley Res", volleyResult);
  }
}

关于java - 接收到 volley 响应后执行该方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459235/

相关文章:

java - 如何在没有第三库的情况下向 Recyclerview 添加快速滚动滚动条

java - 重新加载 fragment

java - 无法安装 ANT 来克隆 Volley 库

Java搜索替换

java - 找不到方法 getComponent()

java - Netty 管道中的多个 ChannelInboundHandlerAdapter

android - 启用使用 Dagger 设置 android workmanager 以在 android worker 中注入(inject)存储库

android - 如何将像素位置(x 和 y 坐标)从一台 Android 设备转换到其他 Android 设备?

java - 在 Android Studio 中使用 Volley 不眨眼地显示函数数据

Android Pay 和 Stripe - BasicNetwork.performRequest,解码 MaskedWallet