error com.android.volley.NoConnection aleatorio, java.io.InterruptedIOException, statuscode = 0

Tengo una aplicación androide nativa utilizando volley marco para buscar los datos de una secuencia de comandos de servidor PHP final.

Funcionó bien en la mayoría de tiempo, pero tengo un porcentaje de fracaso del 20%.

El error dice:

com.android.volley.NoConnection, java.io.InterruptedIOException.

He depurado que encontré el statuscode = 0 , que obviamente estaba mal.

No tengo ni idea de cuál puede ser la razón? Puesto que está trabajando la mayoría del tiempo así que no debe haber código de error obvio.

FYI, los script PHP en el extremo del servidor funciona muy bien para mi aplicación IOS.

Permítanme publicar mi código aquí:

 retryConnBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { txtOut.append("\n"); txtOut.append("Button with Retry Click"); Log.d("Click", "Button Click"); final String url = "https://www.myserver.com/api/getBalanceInfoTest?token=7ff3317a4f3dc07d0c297a7d16d2049c&t=" + System.currentTimeMillis(); //final String url = "http://192.168.1.23/base/test/"; JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { txtOut.append("\n"); txtOut.append("Result with Retry:"); txtOut.append(response.toString()); Log.d("Response", response.toString()); VolleyLog.e("Response:", response.toString()); } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { txtOut.append("\n"); txtOut.append("Error with Retry:"); txtOut.append(error.toString()); Log.d("Error.Response", error.toString()); VolleyLog.e("Error:", error.getMessage()); } }); getRequest.setRetryPolicy(new DefaultRetryPolicy(5000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); queue.add(getRequest); queue.start(); } }); } 

Y para más información, la salida de mi script PHP es: {"hsaBalance":"1000.00"} , creado por la función Json_encode() de PHP .

He arreglado este error. No es un problema de red.

 queue.add(getRequest); queue.start(); 

debiera ser

 queue.add(getRequest); 

Así que la clave es que deberíamos eliminar queue.start() .

Michael Cheng tiene razón, porque volley había comenzado el RequestQueue cuando llamamos newRequestQueue como a continuación:

 public static RequestQueue newRequestQueue(Context context, HttpStack stack) { File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); String userAgent = "volley/0"; try { String packageName = context.getPackageName(); PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); userAgent = packageName + "/" + info.versionCode; } catch (NameNotFoundException e) { } if (stack == null) { if (Build.VERSION.SDK_INT >= 9) { stack = new HurlStack(); } else { // Prior to Gingerbread, HttpUrlConnection was unreliable. // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); } } Network network = new BasicNetwork(stack); RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); queue.start(); return queue; } 

y cuando llamamos el comienzo, el voleo llamará la parada para "cerciorarse de que cualquier despachadores actualmente corriendo esté parado", en el voleo del método de la parada hace esto abajo:

 public void stop() { if (mCacheDispatcher != null) { mCacheDispatcher.quit(); } for (int i = 0; i < mDispatchers.length; i++) { if (mDispatchers[i] != null) { mDispatchers[i].quit(); } } } 

y el método quit lo hace a continuación:

  public void quit() { mQuit = true; interrupt(); } 

tal vez se puede ver la razón, ¿por qué interrumpido.
Más, el método de interrupción hace esto a continuación:

 public void interrupt() { // Interrupt this thread before running actions so that other // threads that observe the interrupt as a result of an action // will see that this thread is in the interrupted state. nativeInterrupt(); synchronized (interruptActions) { for (int i = interruptActions.size() - 1; i >= 0; i--) { interruptActions.get(i).run(); } } } 

la razón quizás esto como metioned arriba:

Interrumpir este subproceso antes de ejecutar acciones para que otros subprocesos que observan la interrupción como resultado de una acción verán que este subproceso está en el estado interrumpido.

Usted está teniendo a veces problemas con su conexión. Mira InterruptedIOException API:

InterruptedIOException Indica que se ha interrumpido una operación de E / S. Se interrumpe una excepción InterruptedIO para indicar que se ha finalizado una transferencia de entrada o de salida porque se interrumpió el subproceso que lo realizó.

así que sólo usted puede hacer es coger las excepciones posibles que ocurren al convertir JSon y tener una solución para esto.

 // rest of your code... final String url = "https://www.myserver.com/api/getBalanceInfoTest?token=7ff3317a4f3dc07d0c297a7d16d2049c&t=" + System.currentTimeMillis(); try { JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null, // rest of your code... queue.add(getRequest); queue.start(); } catch (InterruptedIOException e) { // do something when fail print error, show a toast System.out.err("Error, connection interrupted" + e.getMessage()); Toast.makeText(getApplicationContext(), "press button again", Toast.LENGTH_LONG).show(); } 
  • Cortar contenido en TextView
  • GetActionBar (). SetDisplayHomeAsUpEnabled (true) lanza NullPointerException
  • ¿Hay alguna forma sólida de hacer frente a la autenticación integrada de Windows (NTLM) desde una aplicación de Android?
  • ¿Por qué el VoiceListener basado en Glass / GDK sólo captura VoiceCommand una vez en XE16?
  • Diseño personalizado para DialogFragment OnCreateView vs. OnCreateDialog
  • Android: cómo mostrar la vista previa de la cámara con devolución de llamada?
  • ¿Es posible reemplazar el cuadro de diálogo "Forzar cierre" por defecto en Android?
  • Tipo de lista para almacenar tipos de datos Multipe
  • Convertir la matriz de JSON a la lista de objetos de la clase Java
  • Problemas con ANDROID_ID
  • HashMap Eliminar no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.