安卓 - 等待凌空响应返回

2022-09-01 18:38:48

我需要执行一个Volley请求,并等待响应解析它并返回它,但不知道如何实现这一点。有人可以帮忙吗?

我现在拥有的是这个:

public String getLink() {
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                shortenURL = response.getString("url");
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub

           }
    });

    queue.add(jsObjRequest);

    return shortenURL;
}

答案 1

可重用的工厂方法设计模式解决方案:

要从另一个方法返回或获取 Volley 响应,您需要编写一个回调功能,使用 Interfaces 很容易

这个简单的解决方案取自我的MVC架构,适用于具有完全可重用性和关注点分离概念的Android应用程序。

假设 JSONObject 是来自服务器的响应

步骤 1)

创建接口服务器回拨

package xx.xx.xx.utils;

    import org.json.JSONObject;

    public interface ServerCallback{
        void onSuccess(JSONObject result);
    }

步骤2)假设您的Volley服务器请求方法在控制器或任何其他共享的“上下文”类中执行此操作,在您的任何活动中执行此操作

Controller controller = new Controller();
controller.youFunctionForVolleyRequest(email, password, this, loginUrl, new ServerCallback() {
                    @Override
                    public void onSuccess(JSONObject response) {
                       // do stuff here 
                    }
                  }
               );

3) 在您的 Controller 类中,在 inResponse() 中调用 ServerCallback 函数,该函数将仅在来自服务器的任务完成的响应时执行您在 Activity 中的代码!

 public void youFunctionForVolleyRequest(final String email , final String password ,final Context context , final String URL, final ServerCallback callback)
    {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("email", email);
        params.put("password", password);

        Log.e("sending json",params.toString());
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                URL, new JSONObject(params), new Response.Listener<JSONObject>()
        {

            @Override
            public void onResponse(JSONObject response) {
               callback.onSuccess(response); // call call back function here

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                //VolleyLog.d("Volley error json object ", "Error: " + error.getMessage());

            }
        }){
            @Override
            public String getBodyContentType()
            {
                return "application/json";
            }
        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(jsonObjReq);

    }

答案 2

您可能不应该在方法中返回链接。

Volley正在执行异步任务,这意味着您无法知道答案何时从Web服务到达,可能是10秒或10分钟。

如果在函数中需要该字符串,则可能应该创建一个方法,并在获得结果时调用它。

下面是一个示例:

我想这就是你所拥有的

public void getTheLinkAndCallDoSomething(){
    String link = getLink();
    doSomethingWithTheLink(link);
}

如果以同步方式回答,这将起作用。在这种情况下,凌空不是。getLink()

这就是你可以用Volley做的事情:

public void getTheLinkAndCallDoSomething(){
     JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, 
                               url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        shortenURL = response.getString("url");
                        doSomethingWithTheLink(shortenURL);
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // TODO Auto-generated method stub

                    }
                });

    queue.add(jsObjRequest);
}

在这种情况下,您调用 WS 来获取您的网址。一旦知道结果,您就会调用doSomethingWithTheLink()

无论如何,如果你真的想同步,你可以看看这篇文章:等待异步凌空请求的结果并返回它

另外,请注意,等待答案可能会冻结您的应用程序UI,我想这不是您想要的。


推荐