2011-03-24 42 views
3

要收到網絡連接和斷開連接通知,然後知道我的應用程序是否可以連接到互聯網,我註冊了一個ConnectionManager.CONNECTIVITY_ACTION接收器。目前,我檢查,如果手機有以下這樣一個活動的網絡連接:理解問題CONNECTIVITY_ACTION extras

if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) { 
    // no connection! 
} else { 
    NetworkInfo activeNetInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
    if (activeNetInfo != null && activeNetInfo.isConnectedOrConnecting()) { 
     // active connection! 
    } else { 
     // no connection! 
    } 
} 

不過,我覺得我這樣做不對,因爲我的應用程序有時會誤報手機的連接狀態。閱讀EXTRA_NETWORK_INFO的文檔,它似乎表明,如果爲這個額外返回的值爲null,則不存在連接:「...如果連接管理器嘗試連接(或已連接)到另一個網絡,則用於新網絡的NetworkInfo也作爲額外的「(http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION)傳遞。

的情況下

然而,當我的應用程序誤報連接,只是之前接收CONNECTIVITY_ACTION廣播,getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo()返回NetworkInfo對象,其isConnectedOrConnecting()檢查返回true。所以手機似乎已連接,但通過CONNECTIVITY_BROADCAST返回的NetworkInfo爲空。

我在做我的CONNECTIVITY_ACTION接收器代碼錯了什麼?我不應該檢查EXTRA_NETWORK_INFO)的值嗎?我可以簡單地依靠EXTRA_NO_CONNECTIVITY嗎?

任何幫助表示讚賞!

+0

不推薦使用'EXTRA_NETWORK_INFO'使用getActiveNetworkInfo()或getAllNetworkInfo()。 http://developer.android.com/reference/android/net/ConnectivityManager.html#EXTRA_NETWORK_INFO – 2014-11-25 07:41:30

回答

1

您沒有做錯什麼,但來自isConnectedOrConnecting的唯一可靠值是錯誤的。

即使該方法返回true,也不能保證您能夠連接到網絡。

當Android報告您實際上具有活動連接時,您需要實施某種重試機制,以防連接似乎無法工作。

例如,當連接到公司WIFI網絡時,可能會出現這種情況,所有請求都會重定向到公司登錄頁面。 Android告訴你,你有一個活躍的網絡,但你的查詢顯然會失敗。

即使有了直接的網絡連接,依靠它來返回true也不是一個好主意,如果沒有某種類型的重試機制來適應出現問題的地方。

另一方面,當方法返回false時,可以保證沒有網絡連接。

+0

如果我只應該相信isConnectedOrConnecting()的返回值,那麼如果在我的CONNECTIVITY_ACTION接收器中,如果EXTRA_NETWORK_INFO爲空,我應該假設有一個活動的網絡連接? – skyler 2011-03-24 20:20:38

+0

只有當!activeNetInfo.isConnectedOrConnecting()或activeNetInfo == null時,才應該信任它。 在這一點上,你100%肯定沒有網絡連接。如果它返回true,則表明連接正在建立,但是,爲了確保與某些特定主機之間存在實際的網絡連接,您需要自己執行檢查,或爲您的網絡調用實施重試算法。 – ddewaele 2011-03-24 22:59:46

+0

我理解你的觀點,但我認爲在我的具體情況下,我的「斷開連接」檢查正在評估爲true,因爲我誤解了廣播的文檔:「對於連接丟失,如果連接管理器嘗試連接(或已連接)到另一個網絡,新網絡的NetworkInfo也作爲額外的傳遞。「這似乎表明,如果手機沒有失去連接,而是獲得了連接,則不會發送此額外信息。 – skyler 2011-03-28 15:11:13