簡體   English   中英

如何處理網絡問題

[英]How to deal with network issues

我的一個應用程序使用大量HTTP請求與其后端進行通信。 我使用2種不同的實現來執行這些請求:

  • 大多數情況下的圖書館Volley
  • 幾種情況下AsyncTaskDefaultHttpClient組合

大多數時候,一切都運作良好。 但有時我會提出一系列網絡異常,並將其展示給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時才執行這些請求:

我並不贊成這種事:

  • 如果它測試與實際請求完全相同的事情,則是(i)重復工作和(ii)不同時完成
  • 如果它沒有測試與實際請求完全相同的東西,那么你可能會得到誤報和漏報
  • 在所有情況下,它都是為了預測未來。 它現在可能會失敗並且請求成功,或者現在成功並且請求失敗。
  • 你必須為請求編寫錯誤處理代碼。

一般來說,測試任何資源是否可用的最佳方法只是嘗試以正常方式使用它,並在它們出現時處理任何不利后果。

或者我應該放手,並假設每月達到幾百個這樣的警告是正常的?

我不會說ServerError是正常的。 服務器可能設法通過功能完備的網絡將其發送給您,因此可能是您需要調查的服務器或客戶端錯誤。 另一方面,網絡中斷在任何拓撲和技術中都是“正常的”。

是的,您應該在發出HTTP請求之前檢查互聯網可用性,這為您節省了很多。

您應該使用的代碼非常好,並且比“ping”任何域都要好得多。

但仍然在你的情況下你的條件是不夠的,因為適配器實際上是連接的,但由於連接不良,你可能無法連接到你的服務器。

因此,您仍應處理執行請求時可能發生的超時和IO異常。

- 為你的Httpclient設置超時 - 我認為凌空默認有超時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM