《App 研發(fā)錄》學(xué)習(xí)筆記(一)

花了一天的時(shí)間六剥,把這本書(shū)看了一遍,首先書(shū)中的項(xiàng)目結(jié)構(gòu)演示還是基于eclipse的有一些過(guò)時(shí)樊诺,但也很具有參考意義仗考。該書(shū)中設(shè)計(jì)技術(shù)代碼方便的并不是很多,還是處于一個(gè)比較宏觀的角度去介紹一個(gè)項(xiàng)目從無(wú)到有的方方面面词爬,很適合工作經(jīng)驗(yàn)不足秃嗜,或者公司開(kāi)發(fā)流程不規(guī)范的同學(xué)去了解一個(gè)項(xiàng)目比較專業(yè)的開(kāi)發(fā)流程,還有很多實(shí)際開(kāi)發(fā)過(guò)程中項(xiàng)目重構(gòu)顿膨,和技術(shù)的選用的推薦方法锅锨。

下面就是對(duì)我而言感覺(jué)比較有用的知識(shí)點(diǎn)記錄。

第一部分 高效App架構(gòu)設(shè)計(jì)與重構(gòu)

一恋沃、將項(xiàng)目種與業(yè)務(wù)邏輯無(wú)關(guān)的抽取出來(lái)單獨(dú)創(chuàng)建一個(gè)AndroidLib類(lèi)庫(kù)必搞,類(lèi)庫(kù)只要分為如下幾部分。

  • activity 包中存放的是與業(yè)務(wù)無(wú)關(guān)的 Activity 基類(lèi)囊咏。AndroidLib 下的基類(lèi) BaseActivity 封裝的是業(yè)務(wù)無(wú)關(guān)的公用邏輯恕洲,主項(xiàng)目中的AppBaseActivity 基類(lèi)封裝的是業(yè)務(wù)相關(guān)的公用邏輯。
  • net 包里面存放的是網(wǎng)絡(luò)底層封裝梅割。
  • cache 包里面存放的是緩存數(shù)據(jù)和圖片的相關(guān)處理霜第。
  • ui 包中存放的是自定義控件。
  • utils 包中存放的是各種與業(yè)務(wù)無(wú)關(guān)的公用方法户辞,比如對(duì) SharedPreferences 的封裝泌类。

將無(wú)關(guān)的公共邏輯和各種工具類(lèi)與業(yè)務(wù)邏輯分離出來(lái),能大大方便日后項(xiàng)目的維護(hù)底燎。

二刃榨、統(tǒng)一事件編程模型

這小節(jié)的意思就是講在團(tuán)隊(duì)開(kāi)發(fā)中的點(diǎn)擊事件最好要統(tǒng)一成一種苛让。
比如說(shuō)這種方式用起來(lái)就會(huì)擾亂面向?qū)ο蟮木幊田L(fēng)格邢疙。
@Override
public void onClick(View view) {

    switch (view.getId()) {
            case R.id.sign_in_button:
            Intent intent = new Intent(LoginActivity.this,PersonCenterActivity.class);
            startActivity(intent);
            }
     }

作者更加推崇下面的這種方式
有以下兩個(gè)優(yōu)點(diǎn):

  1. 直接在 btnLogin 這個(gè)按鈕對(duì)象上增加點(diǎn)擊事件竹海,是面向?qū)ο蟮膶?xiě)法惫撰。
  2. 將 onClick 方面的實(shí)現(xiàn)簿晓,封裝成一個(gè) gotoLoginActivity 方法民效,如下所示:
    // 登錄事件
    btnLogin = (Button)f indViewById(R.id.sign_in_button);
    btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            gotoLoginActivity();
            }
    });

最好在團(tuán)隊(duì)中要統(tǒng)一事件模型的方式冕杠。

三谨娜、使用fastJson問(wèn)題注意

如果使用fastJson出現(xiàn)如下問(wèn)題

  1. 加了符號(hào) Annotation 的實(shí)體屬性为流,一使用就崩潰呕屎。
  2. 當(dāng)有泛型屬性時(shí),一使用就崩潰敬察。

需要在混淆文件添加以下代碼:

-keepattributes Signature // 避免混淆泛型
-keepattributes Annotation // 不混淆注解

四秀睛、類(lèi)型安全轉(zhuǎn)換函數(shù)

在某些情況下后臺(tái)會(huì)返回一些臟數(shù)據(jù)(為null,角標(biāo)參數(shù)不正確)莲祸,會(huì)造成程序的崩潰蹂安。這種情況下作者建議創(chuàng)建一個(gè)函數(shù)類(lèi)型轉(zhuǎn)換的工具類(lèi)椭迎。在使用后臺(tái)返回的邏輯之前,先判斷數(shù)據(jù)是否正常田盈。這樣可以防止程序直接崩潰畜号。

第二部分 網(wǎng)絡(luò)底層框架設(shè)計(jì)

一、AsyncTask的缺點(diǎn)允瞧,那就是不能靈活控制其內(nèi)部的線程池简软。

線程池里面的每個(gè)線程存放的都是 MobileAPI 的調(diào)用請(qǐng)求,而 AsyncTask 中又沒(méi)有暴露
出取消這些請(qǐng)求的方法述暂,也就是我們熟知的 CancelRequest 方法痹升,所以,一旦從 A 頁(yè)面跳轉(zhuǎn)
到 B 頁(yè)面畦韭,那么在 A 頁(yè)面發(fā)起的 MobileAPI 請(qǐng)求疼蛾,如果還沒(méi)有返回,并不會(huì)被取消艺配。

二察郁、自動(dòng)登錄

所謂自動(dòng)登錄,就是登錄成功后转唉,重啟 App 后用戶仍然是登錄狀態(tài)绳锅。
最直接的方法是,登錄成功后酝掩,本地保存用戶名和密碼。重啟 App 后眷柔,檢查本地是否有
保存用戶名和密碼期虾,如果有,則將用戶名和密碼傳入到登錄接口驯嘱,模擬用戶登錄的行為镶苞。
本地保存用戶密碼,這種的敏感信息容易被人竊取鞠评。要么是在本地文件中看到這些信
息茂蚓,要么是偵聽(tīng) App 的網(wǎng)絡(luò)請(qǐng)求,獲取到請(qǐng)求的數(shù)據(jù)剃幌。所以本地保存密碼時(shí)聋涨,一定要進(jìn)行加密。對(duì)稱加密是不可靠的负乡,因?yàn)楹茈y確保App 的源代碼不外泄牍白,所以別有用心的人還是可以根據(jù)源碼中的對(duì)稱加密算法,反向把密碼推算出來(lái)抖棘。只有不對(duì)稱加密才是安全的茂腥。

但是上面這種方法在需要用戶需要用戶輸入驗(yàn)證碼的情形下就不是很好了狸涌,于是就要了使用Cookie機(jī)制來(lái)解決自動(dòng)登錄。

三最岗、開(kāi)啟gzip壓縮

接下來(lái)要介紹的內(nèi)容和 gzip 有關(guān)帕胆。 HTTP 協(xié)議上的 gzip 編碼是一種用來(lái)改進(jìn) Web 應(yīng)用
程序性能的技術(shù)。大流量的 Web 站點(diǎn)常常使用 gzip 壓縮技術(shù)來(lái)減少傳輸量的大小般渡,減少傳
輸量大小有兩個(gè)明顯的好處懒豹,一是可以減少存儲(chǔ)空間,二是通過(guò)網(wǎng)絡(luò)傳輸時(shí)诊杆,可以減少傳輸
的時(shí)間

第三部分 列表數(shù)據(jù)的增量更新機(jī)制

Image.png

? 通過(guò)分析比較本地?cái)?shù)據(jù)和遠(yuǎn)程數(shù)據(jù)的異同歼捐,以 cityId 作為唯一標(biāo)識(shí),只在 1.0 中出現(xiàn)的 cityId 是要?jiǎng)h除的數(shù)據(jù)晨汹,只在 2.0 中出現(xiàn)的 cityId 是要增加的數(shù)據(jù)豹储,二者的交集則是 cityId 相同的數(shù)據(jù),這又分為兩種情況淘这,所有字段都相同的數(shù)據(jù)是不變的數(shù)據(jù)剥扣; cityId 相同但某個(gè)字段不相同,則是修改的數(shù)據(jù)铝穷。
于是钠怯,我們可以重新定義城市列表的 JSON 格式,在每筆增量數(shù)據(jù)中增加一個(gè)字段 type曙聂,用來(lái)區(qū)別是增( c)晦炊、刪( d)、改( u)中的哪種情況宁脊。
客戶端在收到上述格式 JSON 數(shù)據(jù)后断国,會(huì)根據(jù) type 值來(lái)處理存放在本地的數(shù)據(jù)。因?yàn)椴皇侨扛掠馨蕴幚砥饋?lái)很快稳衬。

第四部分 Crash異常分析

一、Fragment not attached to Activity
解決辦法:在使用fragment相應(yīng)的方法之前坐漏,增加isAdded()方法判斷薄疚,該方法只有在fragment添加到所屬的Activity后才會(huì)返回true。

二赊琳、解決Dialog在dismiss的時(shí)候Activity已經(jīng)不存在的完美方法(View not attached to window manager)
創(chuàng)建一個(gè)ProgressDialog的子類(lèi)街夭,復(fù)寫(xiě)dismiss方法,在ProgressDialog.diss()執(zhí)行之前判斷Activity是否存在慨畸。

三莱坎、子線程不能修改UI

有一種情況,直接開(kāi)一個(gè)子線程寸士,并在子線程中修改textView的顯示的文字檐什,然而系統(tǒng)卻沒(méi)有報(bào)異常碴卧。不是說(shuō)好的不能再子線程中修改UI嗎,然而實(shí)際上Android官方說(shuō)的是:”不建議在子線程中更新UI乃正,會(huì)因此產(chǎn)生不可預(yù)知的錯(cuò)誤住册。“

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓮具,一起剝皮案震驚了整個(gè)濱河市荧飞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌名党,老刑警劉巖叹阔,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異传睹,居然都是意外死亡耳幢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)欧啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睛藻,“玉大人,你說(shuō)我怎么就攤上這事邢隧〉暧。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵倒慧,是天一觀的道長(zhǎng)按摘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)纫谅,這世上最難降的妖魔是什么院峡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮系宜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘发魄。我一直安慰自己盹牧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布励幼。 她就那樣靜靜地躺著汰寓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苹粟。 梳的紋絲不亂的頭發(fā)上有滑,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音嵌削,去河邊找鬼毛好。 笑死望艺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肌访。 我是一名探鬼主播找默,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吼驶!你這毒婦竟也來(lái)了惩激?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蟹演,失蹤者是張志新(化名)和其女友劉穎风钻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酒请,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骡技,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚌父。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮兰。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苟弛,靈堂內(nèi)的尸體忽然破棺而出喝滞,到底是詐尸還是另有隱情,我是刑警寧澤膏秫,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布右遭,位于F島的核電站,受9級(jí)特大地震影響缤削,放射性物質(zhì)發(fā)生泄漏窘哈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一亭敢、第九天 我趴在偏房一處隱蔽的房頂上張望滚婉。 院中可真熱鬧,春花似錦帅刀、人聲如沸让腹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骇窍。三九已至,卻和暖如春锥余,著一層夾襖步出監(jiān)牢的瞬間腹纳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘲恍,地道東北人足画。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛔钙,于是被迫代替她去往敵國(guó)和親锌云。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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