![](/img/trans.png)
[英]How to deal with these issues with BigDecimal, String and LocalDate in Java?
[英]How to deal with network issues
我的一個應用程序使用大量HTTP請求與其后端進行通信。 我使用2種不同的實現來執行這些請求:
Volley
AsyncTask
和DefaultHttpClient
組合 大多數時候,一切都運作良好。 但有時我會提出一系列網絡異常,並將其展示給Crashlytics:
java.net.UnknownHostException: Unable to resolve host "mydomain.com": No address associated with hostname Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
com.android.volley.ServerError at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:175) at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)
通過一些研究, 我發現這應該發生在設備有一個非常糟糕的3g / 4g或在VPN /子網后面,所以它無法到達我的網站。
如何確保設備真正連接到互聯網? 我實際上只有在此函數返回true時才執行這些請求:
public static boolean isOnline(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
或者我應該放手,並假設每月達到幾百個這樣的警告是正常的?
為了查看您是否有互聯網,您需要做的不僅僅是檢查您是否有網絡連接。 因為如果您連接到慢速網絡,強制網絡門戶或VPN,您可以連接到網絡,但沒有實際的互聯網或可用的互聯網。
這就是為什么你仍然需要通過向服務器或谷歌添加一個簡單的ping來檢查你是否有互聯網/可用互聯網,因為谷歌在99,99%的時間里都有。 您也可以定期或當您發現第一個例外時,這取決於您。
public Boolean isInternet() {
try {
Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = process.waitFor();
boolean reachable = (returnVal==0);
return reachable
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
您也可以使用其他方法,但一般的想法是相同的使用你知道幾乎總是在線的東西,並檢查你是否可以達到它。
但是要保持處理異常,因為沒有辦法總是抓住它並且備份處理事物的方式不會受到傷害
如何確保設備真正連接到互聯網?
你已經找到了。 這就是錯誤告訴你的。
如何確保設備真正連接到互聯網? 我實際上只有在此函數返回true時才執行這些請求:
我並不贊成這種事:
一般來說,測試任何資源是否可用的最佳方法只是嘗試以正常方式使用它,並在它們出現時處理任何不利后果。
或者我應該放手,並假設每月達到幾百個這樣的警告是正常的?
我不會說ServerError
是正常的。 服務器可能設法通過功能完備的網絡將其發送給您,因此可能是您需要調查的服務器或客戶端錯誤。 另一方面,網絡中斷在任何拓撲和技術中都是“正常的”。
是的,您應該在發出HTTP請求之前檢查互聯網可用性,這為您節省了很多。
您應該使用的代碼非常好,並且比“ping”任何域都要好得多。
但仍然在你的情況下你的條件是不夠的,因為適配器實際上是連接的,但由於連接不良,你可能無法連接到你的服務器。
因此,您仍應處理執行請求時可能發生的超時和IO異常。
- 為你的Httpclient設置超時 - 我認為凌空默認有超時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.