2015-07-01 33 views
3

我有一個原生的android應用程序,使用volley框架從PHP服務器端腳本獲取數據。隨機com.android.volley.NoConnection錯誤,java.io.InterruptedIOException,statuscode = 0

它在大多數時間運行良好,但我有20%的失敗百分比。

錯誤說:

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

我調試,我發現statuscode = 0,這顯然是錯誤的。

我不知道可能是什麼原因?由於它的工作時間很長,所以不應該有明顯的錯誤代碼。這些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"},由PHPJson_encode()函數創建。

+1

發佈您的代碼,並看看:http://stackoverflow.com/help/how-to-ask –

+0

感謝您的提醒。 –

回答

1

您的連接有時會出現問題。看看InterruptedIOException API:

InterruptedIOException,一個I/O操作已中斷信號。 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

邁克爾程是正確的,因爲凌空不得不開始請求隊列,當我們要求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(); 
     } 
    } 
} 

的原因,也許這是文件檔案化管理上面:

中斷運行的操作之前,這個線程,使得觀察而中斷的結果其他線程行動將看到這個線程處於中斷狀態。

+0

這很有道理,@xiaoyee。在這裏周圍遇到間歇性問題。謝謝您的幫助。 –