Android客戶端如何規(guī)避服務(wù)端數(shù)據(jù)格式錯誤導(dǎo)致的crash問題

一、背景

場景如下:
應(yīng)用新增了一個功能冕茅,升級了版本伤极,客戶端靜默升級后蛹找,從桌面打開應(yīng)用竟然出現(xiàn)了直接閃退、奔潰的現(xiàn)象哨坪!

測試:不能忍庸疾,無論如何,這是不允許存在的現(xiàn)象当编,怎么可以出現(xiàn)如此嚴重的bug届慈!

服務(wù)端開發(fā):這是由于新增的數(shù)據(jù)字段,沒有被賦予正確格式的原因?qū)е路尥担瑴y試只要在服務(wù)端推送數(shù)據(jù)時修改為正確的格式即可解決金顿。

測試:服務(wù)端并沒有約定說一定要填入那種格式的數(shù)據(jù),我填入“非法數(shù)據(jù)”時鲤桥,并沒有被拒絕揍拆。我不管你們是怎么實現(xiàn)的,總之茶凳,不應(yīng)該在引入新功能的時候發(fā)生如此嚴重的必現(xiàn)bug嫂拴。

服務(wù)端開發(fā):那在客戶端那邊加個try catch,規(guī)避這種crash的嚴重問題贮喧。

客戶端開發(fā):客戶端不像服務(wù)端筒狠,不是所有的問題都是用try catch來解決就可以了,加try catch嚴重影響了效率問題箱沦。就不能在服務(wù)端那邊控制一下辩恼,只傳特定格式的數(shù)據(jù)嗎?

二谓形、分析

服務(wù)端發(fā)送給客戶端的數(shù)據(jù)灶伊,由于不是指定格式的數(shù)據(jù),導(dǎo)致客戶端解析時出現(xiàn)問題套耕,導(dǎo)致應(yīng)用奔潰谁帕。

測試認為服務(wù)端傳入的數(shù)據(jù)應(yīng)該可以是任意的,而客戶端必須要有容錯機制冯袍,一定不能出現(xiàn)這種嚴重的crash問題匈挖。

而服務(wù)端為什么不控制一下,數(shù)據(jù)只能設(shè)置為指定格式數(shù)據(jù)康愤,否則彈出非法數(shù)據(jù)警告提示呢儡循?對服務(wù)端理解尚淺,不理解其中的原理征冷,暫且就認為這是有一定道理的吧择膝。

那么,我們就來探討一下检激,如何從客戶端出發(fā)肴捉,添加數(shù)據(jù)的容錯機制吧腹侣。

前面開發(fā)建議,添加try catch齿穗,若接收到的數(shù)據(jù)為非法數(shù)據(jù)傲隶,則返回默認值。的確窃页,這是解決問題的一種方案跺株,至少,它能確保脖卖,不會因為數(shù)據(jù)格式問題導(dǎo)致crash的不能忍問題乒省。

然而,try catch卻要付出時間的代價畦木。若代碼中大量使用try catch來解決問題袖扛,一是代碼不夠簡潔,二是若數(shù)據(jù)格式確實是非法的馋劈,則增加時間消耗攻锰。

為什么不考慮在做數(shù)據(jù)格式轉(zhuǎn)換之前晾嘶,先做一個數(shù)據(jù)格式檢查妓雾,若為指定格式才對數(shù)據(jù)進行轉(zhuǎn)換呢?這樣一來垒迂,至少在代碼簡潔度上是更加有保障的械姻。

為了對比以上兩種方法的效率問題,我們用數(shù)據(jù)說話机断!

三楷拳、論證

1. 目的:

對比try catch機制與先檢查格式再轉(zhuǎn)換的執(zhí)行效率

2. 準備:

A. 利用junit單元測試來測試代碼塊的執(zhí)行時間,由于代碼的執(zhí)行都是閃速的吏奸,而junit測試也包含了一些初始化的準備時間欢揖,為了更加精確地統(tǒng)計代碼的執(zhí)行時間,采用循環(huán)100次取平均值及納秒級別的時間差來做測試奋蔚。

B. 從所在項目的情況來看她混,最主要問題存在于轉(zhuǎn)化為long型時出錯上,下一步的案例均基于long型數(shù)據(jù)的轉(zhuǎn)化來設(shè)計泊碑,且基本上為項目中常用到的一些情況進行對比坤按。

3. 測試案例編寫:

A. 直接得到的非法字符串轉(zhuǎn)化為long型


非法字符串強制轉(zhuǎn)換

B. 從SharedPrefrence中獲取字段非long型強制轉(zhuǎn)化為long型


獲取字段后強制轉(zhuǎn)換

C. 直接得到的純數(shù)字String轉(zhuǎn)化為long型


純數(shù)字轉(zhuǎn)換

4. 結(jié)果對比:

將上步中的案例執(zhí)行多次,進行耗時對比馒过,為避免偶然性臭脓,進行了多次比較,以下隨機截取了5次執(zhí)行結(jié)果:從結(jié)果可以看出腹忽,雖然每次的執(zhí)行耗時都略有不同来累,但相同的是:不管是在正確格式情況下還是非法數(shù)據(jù)強制轉(zhuǎn)化砚作,tryCatch的耗時都比通過正則表達式先判斷數(shù)據(jù)格式再轉(zhuǎn)換,平均多耗時1ms左右(執(zhí)行100次的情況下)嘹锁,即執(zhí)行1次約多耗時0.01ms 偎巢。

結(jié)果1
結(jié)果2
結(jié)果3
結(jié)果4
結(jié)果5

四、結(jié)論

從第三部分的論證過程可以看出兼耀,先通過正則表達式判斷后再做數(shù)據(jù)處理稍微比tryCatch方式高效率压昼,雖然0.01ms是一個幾乎可以忽略不計的時間,但編碼是一種習(xí)慣瘤运、優(yōu)秀也是一種習(xí)慣窍霞,不只是簡單地用tryCatch來規(guī)避crash問題,而是找到問題的本質(zhì)拯坟,并擇優(yōu)采取更合適的方式解決問題但金,這樣不是更好嗎?同時郁季,盡可能避免tryCatch的使用冷溃,在一定程度上也能夠提高代碼的簡潔度。

五梦裂、代碼

文中涉及代碼鏈接:GitHub

閱讀原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末似枕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子年柠,更是在濱河造成了極大的恐慌凿歼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗恨,死亡現(xiàn)場離奇詭異答憔,居然都是意外死亡,警方通過查閱死者的電腦和手機掀抹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門虐拓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傲武,你說我怎么就攤上這事蓉驹。” “怎么了谱轨?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵戒幔,是天一觀的道長。 經(jīng)常有香客問我土童,道長诗茎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮敢订,結(jié)果婚禮上王污,老公的妹妹穿的比我還像新娘。我一直安慰自己楚午,他們只是感情好昭齐,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矾柜,像睡著了一般阱驾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怪蔑,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天里覆,我揣著相機與錄音,去河邊找鬼缆瓣。 笑死喧枷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弓坞。 我是一名探鬼主播隧甚,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渡冻!你這毒婦竟也來了戚扳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤菩帝,失蹤者是張志新(化名)和其女友劉穎咖城,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼奢,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年切平,在試婚紗的時候發(fā)現(xiàn)自己被綠了握础。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悴品,死狀恐怖禀综,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苔严,我是刑警寧澤定枷,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站届氢,受9級特大地震影響欠窒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜退子,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一岖妄、第九天 我趴在偏房一處隱蔽的房頂上張望型将。 院中可真熱鬧,春花似錦荐虐、人聲如沸七兜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腕铸。三九已至,卻和暖如春铛碑,著一層夾襖步出監(jiān)牢的瞬間恬惯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工亚茬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酪耳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓刹缝,卻偏偏與公主長得像碗暗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梢夯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理言疗,服務(wù)發(fā)現(xiàn),斷路器颂砸,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法噪奄,類相關(guān)的語法,內(nèi)部類的語法人乓,繼承相關(guān)的語法勤篮,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,074評論 25 707
  • 這個話題源于Rita的一句話色罚,“無論是外在的認可碰缔,還是內(nèi)在的認可,首先還是來源于自己的認可戳护。自己先爽金抡,才能愉悅他人...
    莫西時光記閱讀 309評論 2 6
  • 每天25分鐘硬筆字 2017年3月11日打卡 2017年3月13日打卡