2015-07-01 6 views
3

У меня есть собственное приложение для Android, использующее фреймворк volley для извлечения данных из сценария конца сервера PHP.random com.android.volley.NoConnection error, java.io.InterruptedIOException, statuscode = 0

В большинстве случаев он работал хорошо, но у меня 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.

+1

отправьте свой код и посмотрите: http://stackoverflow.com/help/how-to-ask –

+0

спасибо, что напомнили. –

ответ

1

У вас возникли проблемы с подключением. Посмотрите на 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(); 
} 
9

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

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

должен быть

queue.add(getRequest); 

Так ключ мы должны удалить queue.start().

+0

Спасибо, что ты парень! – Muhammad

4

Майкл Cheng прав, потому что залп был начать 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; 
} 

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

public void stop() { 
    if (mCacheDispatcher != null) { 
     mCacheDispatcher.quit(); 
    } 
    for (int i = 0; i < mDispatchers.length; i++) { 
     if (mDispatchers[i] != null) { 
      mDispatchers[i].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(); 
     } 
    } 
} 

причина может быть, это как metioned выше:

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

+0

Это имеет смысл, @xiaoyee. Здесь были проблемы с прерывистой ситуацией. Спасибо за помощь. –

Смежные вопросы