Volley GET请求冻结应用

问题描述:

我正在从API下载大型JSON文件,然后将其写入文件。获取JSON我使用了一个VolleySingleton类和我的GET方法;Volley 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()我的应用程序冻结,停止工作,你会得到一个选项,关闭应用程序或等待,我认为排球是异步的,我这么什么做错了?

+0

将大文本内容加载到Toast中可能会冻结UI。该请求是异步的。 onResponse不是。 –

+0

发布您的代码。 –

验证结果是,请求是异步的。即:在后台线程中执行。我认为原因是因为你有一个大的JSON。

尝试注释以下LOC和应用程式是否冻结。

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

如果应用程序现在不冻结,那是因为响应字符串太大。

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

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

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

+1

啊,现在我觉得很愚蠢,我通常会登录,不知道为什么我要在那里敬酒。多谢,伙计! –

+0

不客气。 –

尝试添加超时和最大试图在这样

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线程并防止阻塞/崩溃的问题。而不是在onResponse中生成Toast消息,使用Log.v("NETLOG", response.toString());