Android, Volley Solicitud, la respuesta está bloqueando el hilo principal

Algo malo está sucediendo cuando se utiliza Volley para tratar una gran respuesta:

String url = AppHelper.DOMAIN + "/service/pages/profile_update.json"; this.infoTextView.setText(getString(R.string.profile_info_updating)); final StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject json = new JSONObject(response); if (json.getBoolean("success")) { // manage JSON object here } else { Toast.makeText(ProfileActivity.this, getString(R.string.connection_problem_server), Toast.LENGTH_LONG).show(); } } catch (JSONException e) { ProfileActivity.this.infoTextView.setText( getString(R.string.profile_info_updating_error)); e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ProfileActivity.this.infoTextView.setText( getString(R.string.profile_info_updating_error)); if (error.networkResponse != null && error.networkResponse.statusCode == 401) { Toast.makeText(ProfileActivity.this, getString(R.string.connection_problem_permission), Toast.LENGTH_LONG).show(); } new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { if (ProfileActivity.this.swipeRefreshLayout != null) { ProfileActivity.this.swipeRefreshLayout.setRefreshing(false); } } }, 1000); error.printStackTrace(); } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<>(); params.put("auth_token", ProfileActivity.this.defaultUser.getAuthenticationToken()); return params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> params = new HashMap<>(); params.putAll(super.getHeaders()); params.put("Accept-Encoding", "gzip,deflate"); return params; } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { StringBuilder output = new StringBuilder(); try { GZIPInputStream gStream = new GZIPInputStream(new ByteArrayInputStream(response.data)); InputStreamReader reader = new InputStreamReader(gStream); BufferedReader in = new BufferedReader(reader, 16384); String read; while ((read = in.readLine()) != null) { output.append(read).append("\n"); } reader.close(); in.close(); gStream.close(); } catch (IOException error) { error.printStackTrace(); return Response.error(new ParseError()); } return Response.success(output.toString(), HttpHeaderParser.parseCacheHeaders(response)); } }; stringRequest.setRetryPolicy(new RetryPolicy() { @Override public int getCurrentTimeout() { // 40 seconds return 40000; } @Override public int getCurrentRetryCount() { return DefaultRetryPolicy.DEFAULT_MAX_RETRIES; } @Override public void retry(VolleyError error) throws VolleyError { throw error; } }); Volley.newRequestQueue(this).add(stringRequest); 

este código bloquea el hilo principal, congelando la aplicación.

Además, establezco algunos valores de cabecera para permitir la respuesta gzip y un código para manejar los datos. Pero no es la pieza la que hace el comportamiento indeseable. La aplicación se onResponse(String response) sólo cuando onResponse(String response) comienza.

¿Qué puedo hacer para evitar esto?

onResponse y onErrorResponse se llama en el hilo de interfaz de usuario, por lo tanto, cualquier operación pesada realizada dentro de estos métodos hará que la aplicación menos sensible. Supongo que está tratando de analizar la respuesta en onResponse () que es incorrecta.

Tienes que pasar a analizar la lógica a parseNetworkResponse ya que este es el método que se llama en el hilo de fondo. Consulte el siguiente enlace para obtener más detalles:

https://developer.android.com/training/volley/request-custom.html

  • ¿Es posible enviar un evento de un hilo a una actividad?
  • Las transacciones en la base de datos no funcionan en android
  • ¿Cómo puedo utilizar una tarea asíncrona para cargar un archivo en el servidor?
  • Android recibe texto de html
  • Necesita ayuda para tratar una Excepción fatal causada por java.lang.IncompatibleClassChangeError
  • Suscribir 2 diferentes Observable y onNext ambos?
  • Estoy haciendo las lecciones de "primera aplicación" en desarrolladores de Android, pero la aplicación no se ejecutará.
  • Algoritmo de pila de partículas
  • Cómo recuperar el valor de un atributo que contiene dos puntos en el nombre del atributo utilizando xpath
  • PopupMenu no se encuentra correctamente dentro de RecyclerView
  • Flip imágenes en un viewpager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.