Volley GET请求冻结应用程序

时间:2016-03-04 05:31:30

标签: android json android-volley

我从API下载一个大型JSON文件,然后将其写入文件。要获取JSON我使用VolleySingleton类和我的GET方法;

 public void sendJSONRequest(){
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
            URL,
            (String) null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    mRequestQueue.add(jsonObjectRequest);

}  

但是当我在我的Activity的OnCreate方法上调用sendJSONRequest()时,我的应用程序会冻结并停止工作,您将获得关闭应用程序或等待的选项,我认为Volley是异步的,所以我做错了什么?

2 个答案:

答案 0 :(得分:2)

尝试在排球请求中添加超时和最大尝试策略,如下所示

    final int CONNTIMEOUT=30000;

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,urlBuffer.toString(),null,
                            new Response.Listener<JSONObject>(){

                                @Override
                                public void onResponse(JSONObject response) {
                                    Log.i(Constants.NETLOG, "Volley response= " + response.toString());
                                    //Success response

                                    if(dialog!=null && dialog.isShowing())
                                    {dialog.dismiss();}
                                }
                            }, new Response.ErrorListener(){
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e(Constants.NETLOG, "VolleyError response= " + error.toString());
                            if(dialog!=null && dialog.isShowing())
                            {dialog.dismiss();}
                            //Error in response
                        }
                    });
        jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(
                            CONNTIMEOUT,
                        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                    Volley.newRequestQueue(mContext).add(jsonObjReq);
ProgressDialog dialog = ProgressDialog.show(mContext, "Please wait", "Processing.........");


一旦完成此操作,请在后台线程中执行成功响应过程,如果根据您的问题有大量数据使用AsyncTask释放您的UI线程并防止阻塞/崩溃。而不是在Toast中发送onResponse条消息,请使用Log.v("NETLOG", response.toString());验证结果

答案 1 :(得分:2)

是的,请求是异步的。即:在后台线程中执行。我认为原因是因为您拥有大量的JSON。

尝试评论以下LOC并查看该应用是否会冻结。

Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show();

如果应用现在没有冻结,那么因为响应字符串太大了。

在这种情况下,您还需要在AsyncTask中执行响应处理。

注意:您无法在UI线程以外的线程中显示Toast。但是假设您正在尝试解析json并将其保存到SQLite数据库,那么您可以在AsyncTask中执行此操作。

如果应用程序在评论上述LOC后仍然冻结,则其他地方出现问题。