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.
- Regex no funciona en Android pero funciona bien en Java
- Android - No puede eliminar la red Wifi de forma programática El método removeNetwork (int) en el tipo WifiManager no es aplicable a los argumentos (String)
- Android Múltiples secuencias de clics en textview
- Respetando el bloqueo de rotación en android
- ¿Cómo puedo desarrollar para Android en Emacs?
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?
- Android Studio - con Junit 4.12 "!!! JUnit versión 3.8 o posterior esperado: "
- ¿Por qué un Comparator debería implementar Serializable?
- ¿Existe una utilidad o API para convertir abreviaturas abreviadas de SMS a oraciones adecuadas?
- Lectura de archivos desde almacenamiento externo de Android SDK Emulator
- Agregar varios contactos en lote
- Cómo obtener la terminación del código de estilo de Eclipse en Android Studio
- Biblioteca de importación de Android
- Opencv Android: java.lang.UnsatisfiedLinkError: dlopen falló: no se pudo cargar la librería "libopencv_java.so"
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
- CollapsingToolbarLayout no funciona bien con NestedScrollView
- Generar LatLng aleatorio dada la ubicación del dispositivo y el radio