在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Handling Runtime Changes
Launch mode 和 Intent flags專題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語(yǔ)言精粹》
Memory leak專題
React基礎(chǔ)
《Test Driven Development: By Example》一書(shū)
Developer tools
安卓開(kāi)發(fā)技能樹(shù)
<a rel="nofollow" href="https://mp.weixin.qq.com/s?__biz=MzA3NDM
Best Practices for Interaction and Engagement
各個(gè)安卓版本引入的主要新特性
Building Apps with Connectivity &amp; the Cloud
List.toArray()再?gòu)?qiáng)轉(zhuǎn)是一定會(huì)失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)范式
《App研發(fā)錄》一書(shū)
REST API設(shè)計(jì)
Google IO 2015摘要
自定義View/ViewGroup以及高性能實(shí)現(xiàn)自定義UI
安卓系統(tǒng)點(diǎn)擊事件處理
《50 Android Hacks》一書(shū)
Building Apps with Content Sharing
Flux基礎(chǔ)
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機(jī)制
Java對(duì)象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(cè)(<a rel="nofollow" href="http://develop
Futurice公司安卓團(tuán)隊(duì)的建議
安卓性能優(yōu)化
  • 1.
Best Practices for Performance
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
<a rel="nofollow" href="http://blog.danlew.net/2014/11/19/styles
Handling Runtime Changes
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
Building Apps with Graphics &amp; Animation
<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Android項(xiàng)目架構(gòu)
MVP(Model-View-Presenter)模式
<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》一書(shū)
Rx在Android中的最佳實(shí)踐
函數(shù)調(diào)用時(shí),傳遞參數(shù)應(yīng)該是不可變的(Immutable)
ProGuard
面向?qū)ο罅笤瓌t(SOLID+)
深入理解Java虛擬機(jī)
深入Java深淺拷貝、immutable、unmodifiable
Best Practices for User Input
UI上的一些高效方式/最佳實(shí)踐
<a rel="nofollow" href="https://blog.stylingandroid.com/ripples-
Best Practices for User Interface
安卓測(cè)試驅(qū)動(dòng)開(kāi)發(fā)/安卓測(cè)試驗(yàn)證
暗時(shí)間:學(xué)會(huì)正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動(dòng)效專題
Feed系統(tǒng)的設(shè)計(jì)
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書(shū)筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點(diǎn)子
WebRTC

Handling Runtime Changes

Runtime Changes包括orientation,鍵盤(pán)可見(jiàn)性,語(yǔ)言設(shè)置等,這些內(nèi)容發(fā)生變化后, 系統(tǒng)將重啟Activity(先執(zhí)行onDestroy,再執(zhí)行onCreate),以便APP可以響應(yīng) 這些變化。

onSaveInstanceState()onRestoreInstanceState()回調(diào)在這種情形下可以 使得APP能保存已有狀態(tài),在Activity重新創(chuàng)建時(shí)能夠恢復(fù)已有狀態(tài),為用戶提供一致的體驗(yàn)。

如果需要把已加載的數(shù)據(jù)應(yīng)用到新的狀態(tài)中,有兩種方式:

  • 在配置發(fā)生變化時(shí),保留數(shù)據(jù)
  • 當(dāng)配置發(fā)生變化時(shí),不要重新創(chuàng)建Activity(系統(tǒng)默認(rèn)行為),而是響應(yīng)相應(yīng)事件, 手動(dòng)改變Activity狀態(tài)

Retaining an Object During a Configuration Change

onSaveInstanceState()onRestoreInstanceState()并不是設(shè)計(jì)用來(lái)傳遞大量數(shù)據(jù)的, 其傳遞的Bundle對(duì)象有大小限制。而且Bundle中的數(shù)據(jù)都會(huì)先反序列化再序列化,耗時(shí)較多。

可以使用Fragment,調(diào)用Fragment::setRetainInstance(true),在Activity重新創(chuàng)建之后, 通過(guò)FragmentManager獲取到重用的Fragment對(duì)象,進(jìn)而獲取到已有的數(shù)據(jù)。這里需要注意的是, Fragment不能直接或者間接持有Activity的引用,否則可能會(huì)導(dǎo)致老的Activity對(duì)象的內(nèi)存泄漏。

利用這一方式,有一種HeadlessFragment的用法,這個(gè)Fragment沒(méi)有UI,只負(fù)責(zé)后臺(tái)加載數(shù)據(jù), 它不會(huì)因?yàn)锳ctivity的配置變化銷毀而銷毀,可以保證數(shù)據(jù)獲取過(guò)程的連續(xù)性。

Handling the Configuration Change Yourself

Activity可以在manifest中聲明自行處理配置變化,同時(shí)onConfigurationChanged()回調(diào)會(huì) 在配置變化時(shí)被執(zhí)行。這種方式是最為復(fù)雜的,應(yīng)該是最后的考慮選項(xiàng)。

android:configChanges="orientation|screenSize|keyboardHidden"

配置發(fā)生變化之后,getResources()函數(shù)返回的對(duì)象是新配置下的資源對(duì)象,可以直接使用,

Loaders

相比于上述通過(guò)Fragment保留數(shù)據(jù)的方式,更建議使用Loaders進(jìn)行替換。Loaders自安卓3.0引入, 用于異步加載數(shù)據(jù),Activity和Fragment均可以使用。

Loader框架包含了一個(gè)CursorLoader實(shí)現(xiàn),包括了異步請(qǐng)求數(shù)據(jù),Activity/Fragment銷毀重新 創(chuàng)建時(shí)直接返回已有數(shù)據(jù)等功能。

  • Activity/Fragment重新創(chuàng)建時(shí)數(shù)據(jù)保留:Loader對(duì)象并不會(huì)被銷毀,其生命周期由framework維護(hù) (包括不會(huì)銷毀與需要銷毀的情形);
  • 異步加載:基于AsyncTask,但異步邏輯無(wú)需實(shí)現(xiàn);
  • 數(shù)據(jù)更新:自行檢測(cè)數(shù)據(jù)變更,但是提供了更新數(shù)據(jù)的相應(yīng)API;
  • framework/support內(nèi)的實(shí)現(xiàn),Google背書(shū);
  • framework提供了LoaderTestCase類,用于測(cè)試;
  • 需要什么測(cè)試?
    • Loader有其數(shù)據(jù)更新/發(fā)送/重置的邏輯,需要單元測(cè)試;
    • Loader對(duì)于framework的依賴無(wú)法隔離(Handler, AsyncTask等),而且LoaderTestCase 也是需要AndroidJUnitTestRunner執(zhí)行的;
    • Loader和數(shù)據(jù)源有對(duì)接,需要集成測(cè)試;
  • 對(duì)比MVP?
    • 相當(dāng)于presenter;
    • 能否結(jié)合?如果僅僅是對(duì)于設(shè)計(jì)模式來(lái)說(shuō),當(dāng)然是可以的;但對(duì)Mosby來(lái)說(shuō),兩者是有重復(fù)工作的,例如retain state,life cycle綁定,而且這部分 工作都能滿足需求,也有背書(shū);