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%.
- Android - java.lang.RuntimeException: Excepción Stub al analizar String en JSONObject
- Cómo analizar este tipo de json String con Gson?
- Kotlin android parcelable
- La página de vista web de Android no carga correctamente la página
- Java convertir ArrayList a cadena y volver a ArrayList?
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
.
- Dibujo ShapeRenderer transparente en libgdx
- Android WebView devuelve siempre null para javascript getElementById en loadUrl
- Precisamente Sync Looped Audio con animación en Android
- Android Machine no está en la red
- ¿Cómo importar ZXING a android studio?
- ¿Cómo obtener datos de cada EditText creado dinámicamente en Android?
- ¿Cómo agregar dinámicamente elementos a String array?
- Cómo agregar matriz a okhttp cuerpo (POST)
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(); }
- intentando enviar la intención a otra aplicación: error SecurityException: Negación de permisos: Starting Intent
- Android 3: agregue un fragmento mediante programación: excepción de estado ilegal