Android 使用ping判斷網(wǎng)絡(luò)/WIFI連接是否可用

最近項(xiàng)目中有一個(gè)網(wǎng)絡(luò)判斷的需求浅碾,因?yàn)榻K端只能連接wifi,wifi即使連接上也可能會(huì)出現(xiàn)不能連接網(wǎng)絡(luò)的問題,所以需要進(jìn)行網(wǎng)絡(luò)連接的判斷。
ping的相關(guān)知識(shí)

使用ping檢驗(yàn)網(wǎng)絡(luò)是否可以連接

ping就是檢測(cè)客戶端是否可以上網(wǎng)球榆。
那么我們就上代碼
該段代碼來(lái)自http://blankj.com
導(dǎo)入常用工具包compile 'com.blankj:utilcode:1.9.8'
這個(gè)里邊有各種各樣的常用的工具類,下邊的代碼是NetworkUtils的一個(gè)方法禁筏;

/**
     * 判斷網(wǎng)絡(luò)是否可用
     * <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p>
     * <p>需要異步ping芜果,如果ping不通就說(shuō)明網(wǎng)絡(luò)不可用</p>
     *
     * @param ip ip地址(自己服務(wù)器ip),如果為空融师,ip為阿里巴巴公共ip
     * @return {@code true}: 可用<br>{@code false}: 不可用
     */
    public static boolean isAvailableByPing(String ip) {
        if (ip == null || ip.length() <= 0) {
            ip = "223.5.5.5";// 阿里巴巴公共ip
        }
        ShellUtils.CommandResult result = ShellUtils.execCmd(String.format("ping -c 1 %s", ip), false);
        boolean ret = result.result == 0;
        if (result.errorMsg != null) {
            Log.d("NetworkUtils", "isAvailableByPing() called" + result.errorMsg);
        }
        if (result.successMsg != null) {
            Log.d("NetworkUtils", "isAvailableByPing() called" + result.successMsg);
        }
        return ret;
    }

這段代碼完全可以作為網(wǎng)絡(luò)檢測(cè)的使用,可是我在使用這段代碼的時(shí)候偶爾會(huì)遇到anr的問題蚁吝。出現(xiàn)anr就說(shuō)明在主線程做了耗時(shí)操作旱爆,這是我沒有將這段代碼放到子線程造成的問題。其實(shí)ping也就相當(dāng)于去請(qǐng)求網(wǎng)絡(luò)窘茁,跟普通的接口請(qǐng)求差不多怀伦,當(dāng)網(wǎng)絡(luò)比較慢的時(shí)候就會(huì)消耗時(shí)間,放在主線程就會(huì)造成anr山林。
在修改bug的時(shí)候我對(duì)這段代碼進(jìn)行了一些修改:

   * 判斷網(wǎng)絡(luò)是否可用
     * <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p>
     * <p>需要異步ping房待,如果ping不通就說(shuō)明網(wǎng)絡(luò)不可用</p>
     *
     * @param ip ip地址(自己服務(wù)器ip),如果為空,ip為阿里巴巴公共ip
     * @return {@code true}: 可用<br>{@code false}: 不可用
     */
    public static boolean isAvailableByPing(String ip) {
        if (ip == null || ip.length() <= 0) {
            ip = "223.5.5.5";// 阿里巴巴公共ip
        }
       Runtime runtime = Runtime.getRuntime();
        Process ipProcess = null;
        try {
            //-c 后邊跟隨的是重復(fù)的次數(shù)桑孩,-w后邊跟隨的是超時(shí)的時(shí)間拜鹤,單位是秒,不是毫秒流椒,要不然也不會(huì)anr了
            ipProcess = runtime.exec("ping -c 3 -w 3 "+ip);
            int exitValue = ipProcess.waitFor();
            Log.i("Avalible", "Process:" + exitValue);
            return (exitValue == 0);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            //在結(jié)束的時(shí)候應(yīng)該對(duì)資源進(jìn)行回收
            if (ipProcess != null) {
                ipProcess.destroy();
            }
            runtime.gc();
        }
        return false;
    }

只需要把這個(gè)方法引用到子線程中就行了敏簿,其實(shí)不引用也可以,因?yàn)樵谶@里設(shè)定了超時(shí)時(shí)間為3秒宣虾。但是最好是放到子線程里邊惯裕。

問題補(bǔ)充

上邊的代碼在Android 7.1.2中出現(xiàn)了問題,好好的WIFI連接上之后绣硝,ping不通蜻势,每次waitfor都返回1,返回一表示W(wǎng)iFi連接鹉胖,但是沒有網(wǎng)絡(luò)握玛。其實(shí)是有網(wǎng)絡(luò)的,很奇怪次员。
解決方法:
這里我獲取了ping時(shí)抓包的信息败许,判斷是否丟包為100%。如果為100%,就說(shuō)明網(wǎng)絡(luò)有問題淑蔚。不是100%說(shuō)明網(wǎng)絡(luò)連接沒問題市殷。
廢話不多說(shuō),直接上代碼刹衫!老鐵雙擊666醋寝,,哈哈??

 public boolean isNetworkOnline() {

        Runtime runtime = Runtime.getRuntime();
        Process ipProcess = null;
        try {
            ipProcess = runtime.exec("ping -c 5 -w 4 223.5.5.5");
            InputStream input = ipProcess.getInputStream();

            BufferedReader in = new BufferedReader(new InputStreamReader(input));
            StringBuffer stringBuffer = new StringBuffer();
            String content = "";
            while ((content = in.readLine()) != null) {
                stringBuffer.append(content);
            }

            int exitValue = ipProcess.waitFor();
            if (exitValue == 0) {
                //WiFi連接带迟,網(wǎng)絡(luò)正常
                return true;
            } else {
                if (stringBuffer.indexOf("100% packet loss") != -1) {
                    //網(wǎng)絡(luò)丟包嚴(yán)重音羞,判斷為網(wǎng)絡(luò)未連接
                    return false;
                } else {
                    //網(wǎng)絡(luò)未丟包,判斷為網(wǎng)絡(luò)連接
                    return true;
                }
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (ipProcess != null) {
                ipProcess.destroy();
            }
            runtime.gc();
        }
        return false;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仓犬,一起剝皮案震驚了整個(gè)濱河市嗅绰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搀继,老刑警劉巖窘面,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叽躯,居然都是意外死亡财边,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門点骑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)酣难,“玉大人谍夭,你說(shuō)我怎么就攤上這事『┠迹” “怎么了紧索?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)馋嗜。 經(jīng)常有香客問我齐板,道長(zhǎng),這世上最難降的妖魔是什么葛菇? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任甘磨,我火速辦了婚禮,結(jié)果婚禮上眯停,老公的妹妹穿的比我還像新娘济舆。我一直安慰自己,他們只是感情好莺债,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布滋觉。 她就那樣靜靜地躺著,像睡著了一般齐邦。 火紅的嫁衣襯著肌膚如雪椎侠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天措拇,我揣著相機(jī)與錄音我纪,去河邊找鬼。 笑死丐吓,一個(gè)胖子當(dāng)著我的面吹牛浅悉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播券犁,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼术健,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了粘衬?” 一聲冷哼從身側(cè)響起荞估,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稚新,沒想到半個(gè)月后勘伺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枷莉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尺迂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笤妙。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冒掌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹲盘,到底是詐尸還是另有隱情股毫,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布召衔,位于F島的核電站铃诬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苍凛。R本人自食惡果不足惜趣席,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醇蝴。 院中可真熱鬧宣肚,春花似錦、人聲如沸悠栓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惭适。三九已至笙瑟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間癞志,已是汗流浹背往枷。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留今阳,地道東北人师溅。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盾舌,于是被迫代替她去往敵國(guó)和親墓臭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,509評(píng)論 25 707
  • 面試必背 會(huì)舍棄妖谴、總結(jié)概括——根據(jù)我這些年面試和看面試題搜集過來(lái)的知識(shí)點(diǎn)匯總而來(lái) 建議根據(jù)我的寫的面試應(yīng)對(duì)思路中的...
    luoyangzk閱讀 6,743評(píng)論 6 173
  • 不想去做自己不喜歡的事 不想被世故所困擾 不想去評(píng)價(jià)他人 想做一個(gè)善良簡(jiǎn)單的人 好想活在自己的世界里 沒有外界的干...
    柚yoy閱讀 177評(píng)論 0 0
  • Run through the rain She had been shopping with her Mom i...
    rose吳閱讀 410評(píng)論 0 0