2016-03-04 97 views
0

我正在從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

發佈您的代碼。 –

回答

2

驗證結果是,請求是異步的。即:在後臺線程中執行。我認爲原因是因爲你有一個大的JSON。

嘗試註釋以下LOC和應用程式是否凍結。

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

如果應用程序現在不凍結,那是因爲響應字符串太大。

在這種情況下,您還需要在AsyncTask中執行響應處理。

注意:不能在UI線程以外的線程中顯示Toast。但是,假設你試圖解析json並將其保存到SQLite數據庫,那麼你可以在AsyncTask中執行此操作。

如果應用程序在評論上述LOC後仍然凍結,那麼其他地方有問題。

+1

啊,現在我覺得很愚蠢,我通常會登錄,不知道爲什麼我要在那裏敬酒。多謝,夥計! –

+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線程並防止阻塞/崩潰的問題。而不是在onResponse中生成Toast消息,使用Log.v("NETLOG", response.toString());