如何等待RequestQueue作业完成?

时间:2015-03-05 02:10:14

标签: android get nonblocking

我正在尝试为我的应用创建一个登录页面。我通过对绑定到我的用户数据库的Web服务器执行get请求来检查凭据。

public boolean checkCredentials(String email, String password) throws JSONException {

    // Make a get request to the server
    String url = MyUtils.createLoginUrl(email, password);

    JsonObjectRequest jsObjRequest = new JsonObjectRequest
            (Request.Method.GET, url, requestParam, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    successLogin = response.length() > 0;
                    jsonResponse = response.length() > 0 ? response : null;
                    //requestPending -= 1;
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    MyUtils.showToast(getBaseContext(), error.getMessage().toString());
                    //requestPending -= 1;
                }
            });

    SingletonRequestQueue.getInstance(this).addToRequestQueue(jsObjRequest);
    //requestPending += 1;
    // I WANT THE JOB TO FINISH BEFORE RETURNING FROM THIS FUNCTION
    return successLogin;
}

使用Volley库是否有非阻塞方式?谷歌并没有给我很多信息。

1 个答案:

答案 0 :(得分:0)

你不能和Volley一起使用其他工具。长时间运行的操作,如前往数据库或网络阻止UI线程,这是一个不好的做法,因为用户无法与UI进行交互。

谈论凌空,它在三个线程级别中完成所有这些工作异步:

  • UI
  • 高速缓存
  • 网络

请参阅here架构。 所有三个级别都允许系统缓存响应,并使用池线程在有足够空间和内存的情况下同时分派所有请求。

前段时间人们建议你这样做:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

这避免了NetworkOnMainThreadException,但正如我之前告诉你的那样,这是一个非常 糟糕的做法 ,因为你将通过等待来跳过一堆帧。 我知道听众很痛苦,但我们必须在Android Dev中与他们一起生活。