2016-03-04 3 views
0

Я загружаю большой файл JSON из API, а затем записываю его в файл. Чтобы ПОЛУЧИТЬ JSON, я использую класс VolleySingleton и мой метод GET;Volley GET Request freezes app

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); 

} 

Но когда я называю sendJSONRequest() на OnCreate метод моей деятельности в мое приложение зависает и перестает работать, вы получите возможность закрыть приложение или подождать, я думал Залп был асинхронным, так, что я делать не так?

+0

Возможно, загрузка большого текстового содержимого в Toast заморозит пользовательский интерфейс. Запрос является асинхронным. OnResponse нет. –

+0

напишите свой код. –

ответ

2

Да, запросы асинхронны. т.е.: Выполняется в фоновом потоке. Я думаю, причина в том, что у вас большой JSON.

Попробуйте комментировать следующий LOC и посмотрите, зависает ли приложение.

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

Если приложение не замораживает сейчас, это связано с тем, что строка ответа слишком велика.

В этом случае вам также необходимо выполнить обработку ответа в AsyncTask.

ПРИМЕЧАНИЕ. Вы не можете отображать Toast в потоке, отличном от потока пользовательского интерфейса. Но предположим, что вы пытаетесь разобрать json и сохранить его в SQLite db, тогда вы можете сделать это в AsyncTask.

Если приложение все еще зависает после комментирования вышеуказанного LOC, то в другом месте что-то не так.

+1

Ahhh теперь я чувствую себя глупо, я обычно Лог, не знаю, почему я поставил тост прямо там. Спасибо приятель! –

+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, чтобы освободить поток пользовательского интерфейса и предотвратить блокировку/сбой. И вместо сообщения Toast в onResponse, проверьте результат с помощью Log.v("NETLOG", response.toString());