Случайная ошибка com.android.volley.NoConnection, java.io.InterruptedIOException, statuscode = 0

У меня есть собственное приложение для Android, использующее платформу volley для извлечения данных из сценария конца сервера PHP .

Он работал хорошо в большинстве случаев, но у меня 20% -ный отказ.

Ошибка говорит:

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

Я отлаживал, что нашел statuscode = 0 , что, очевидно, было неправильным.

Я понятия не имею, что может быть причиной? Поскольку он работает больше всего времени, поэтому не должно быть очевидного кода ошибки.

FYI, этот PHP-скрипт на сервере отлично подходит для моего приложения IOS.

Пожалуйста, позвольте мне написать мой код здесь:

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

И для получения дополнительной информации, выход моего скрипта PHP : {"hsaBalance":"1000.00"} , созданный Json_encode() PHP .

Я исправил эту ошибку. Это не проблема сети.

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

должно быть

 queue.add(getRequest); 

Таким образом, мы должны удалить queue.start() .

Майкл Ченг прав, потому что волейбол начал RequestQueue, когда мы вызываем newRequestQueue, как показано ниже:

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

И когда мы вызываем начало, залп вызовет стоп, чтобы «убедиться, что все запущенные диспетчеры остановлены», в методе остановки метод volley делает это ниже:

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

И метод quit делает это ниже:

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

Может быть, вы видите причину, почему прервали ее.
Более того, метод прерываний делает это ниже:

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

Причина, может быть, это, как указано выше:

Прерывайте этот поток перед запуском действий, чтобы другие потоки, которые наблюдали прерывание в результате действия, увидели, что этот поток находится в прерванном состоянии.

У вас возникают проблемы с подключением. Посмотрите на InterruptedIOException API:

InterruptedIOException Сигналы о том, что операция ввода-вывода была прервана. Прерывание InterruptedIOException указывается, что передача ввода или вывода завершена, потому что поток, выполняющий его, был прерван.

Так что только вы можете сделать это, чтобы поймать возможные исключения, возникающие при преобразовании JSon и обходной путь для этого.

 // 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(); } 
Intereting Posts
Как программно определить, в какой стране находится устройство Android в настоящее время без использования GPS? Android, как выполнить sql-файл в sqlitedatabase Как найти список адресов электронной почты для определенного формата? Как я могу заставить GoogleApiClient запрашивать пользовательский интерфейс выбора учетной записи каждый раз, когда я вызываю соединение? Android OpenGL Transparent Texture Draws Black Усилие WIFI_STATE_CHANGED_ACTION не получено при подключении к точке доступа WiFi? Android-версия релиза не zipaligning Как импортировать сценарий Metaio в Android Studio? Ошибка службы Google Play при создании клиента OAuth2.0 Сборщик данных фонового датчика в Android Android BLE: определить характерный тип? Использование библиотеки Scala для приложения для Android Преобразование строки в класс Activity Как показать кнопку в конце Android ListView Android-приложение, которое работает поверх всех других приложений?