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

鍍金池/ 教程/ Android/ MVP(Model-View-Presenter)模式
Launch mode 和 Intent flags專題
Canvas & Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語言精粹》
Memory leak專題
React基礎(chǔ)
《Test Driven Development: By Example》一書
Developer tools
安卓開發(fā)技能樹
<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()再強(qiáng)轉(zhuǎn)是一定會(huì)失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫設(shè)計(jì)范式
《App研發(fā)錄》一書
REST API設(shè)計(jì)
Google IO 2015摘要
自定義View/ViewGroup以及高性能實(shí)現(xiàn)自定義UI
安卓系統(tǒng)點(diǎn)擊事件處理
《50 Android Hacks》一書
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)》一書
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)開發(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一書筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點(diǎn)子
WebRTC

MVP(Model-View-Presenter)模式

工作流程

http://wiki.jikexueyuan.com/project/notes/images/MVP.png" alt="MVP.png" />

  • view通常會(huì)持有presenter的引用;
  • presenter持有view和model的引用;
  • model應(yīng)該包括數(shù)據(jù)和對(duì)數(shù)據(jù)的獲取或者修改操作;

具體來說

http://wiki.jikexueyuan.com/project/notes/images/MVP1.png" alt="MVP1.png" />

  • MVP之間應(yīng)該盡量解耦,可以通過定義接口來實(shí)現(xiàn),相互持有的是接口引用;
  • view應(yīng)該盡可能聽從presenter的指令,而不是自己控制,如:接受presenter的showLoading指令之后才顯示正在加載;
  • 與用戶的交互由view負(fù)責(zé),顯示的細(xì)節(jié)由view負(fù)責(zé);

MVP in Android(Mosby)

  • 使用場(chǎng)景:?jiǎn)我坏腢I單元,例如fragment,或者一個(gè)ViewGroup,原則是這部分UI由一個(gè)presenter獨(dú)立負(fù)責(zé),不必相互干擾;
  • Acticity、Fragment更應(yīng)該是view,而不是presenter;
  • core模塊集成了Butterknife、FragmentArgs、Icepick等開源庫;
  • MVP模塊,定義了MvpPresenter,MvpActivity、MvpFragment類,作為presenter,view的基類;
  • MvpPresenter是一個(gè)接口,有一個(gè)MvpBasePresenter實(shí)現(xiàn),使用WeakReference保存view的引用,所以presenter(子類)要調(diào)用view的接口時(shí),需要調(diào)用isViewAttached()檢查view是否有效,調(diào)用getView()獲取其引用;
  • MvpLceView,模板化loading-content-error流程;
  • ViewState模塊:保存view(并非android中的View)的狀態(tài),處理屏幕旋轉(zhuǎn)、view(fragment、activity)重新創(chuàng)建時(shí)的狀態(tài)恢復(fù);
  • 還有針對(duì)dagger、retrofit、rx、testing等的模塊;

一些建議

  • Don’t “over-architect”
    In fact refactoring is a vital part of development, you simply can’t avoid it (but you can try to minimize the number of refactoring). Start with doing the simple thing and afterwards refactor and make it more extensible as app and requirements grow.
  • Use inheritance wisely
    正確利用繼承,基類擁有基本特點(diǎn),子類增加新特性;避免“子類爆炸”;
  • Don’t see MVP as an MVC variant
    http://wiki.jikexueyuan.com/project/notes/images/mvp-controller.png" alt="mvp-controller.png" />
    Controller負(fù)責(zé)控制View(UI)和用戶交互時(shí)應(yīng)該執(zhí)行的動(dòng)作(調(diào)用Presenter的哪個(gè)方法);當(dāng)被Presenter調(diào)用顯示方法時(shí),如何顯示(動(dòng)效、數(shù)據(jù)使用方式);
  • Take separation of Model, View and Presenter serious
    寫代碼的時(shí)候,認(rèn)真思考每一行代碼的功能應(yīng)該屬于哪個(gè)模塊,目前的位置是否合適?
    • View負(fù)責(zé)UI顯示,以及對(duì)UI、用戶的響應(yīng)
    • Model負(fù)責(zé)數(shù)據(jù)獲取、存儲(chǔ)、處理
    • Presenter負(fù)責(zé)配合/連接兩者
  • Presentation Model
    • 當(dāng)UI顯示對(duì)于model的需求與數(shù)據(jù)源不一致時(shí):最好的辦法是加一層wrapper;其次是為model加一些方法,產(chǎn)生需要的域;最差的是為model加上這些域;
  • Navigation is a UI thing
    不同界面之間的跳轉(zhuǎn)應(yīng)該由view負(fù)責(zé)
  • onActivityResult() and MVP
    當(dāng)result僅僅用于顯示時(shí),無需涉及presenter;當(dāng)需要額外處理時(shí),例如圖片處理、上傳等,則需要放到presenter中去;
  • MVP and EventBus - A match made in heaven
    EventBus常被用于業(yè)務(wù)邏輯事件、UI更新事件(fragment之間通信)
    • 前者presenter負(fù)責(zé)接收event,控制view顯示;
    • 后者有一種常見做法:Activity實(shí)現(xiàn)一個(gè)listener接口,讓fragment持有該接口引用(attach時(shí)賦值),使用該接口進(jìn)行通信;然而使用EventBus更合適,解耦更徹底;
  • Optimistic propagation
    用戶的操作,首先給其成功的反饋,然后在后臺(tái)進(jìn)行處理,失敗后給出失敗的提示,并撤銷成功的反饋(顯示),這種做法對(duì)于用戶體驗(yàn)或許更佳;
    如何看待內(nèi)存泄漏:避免activity/fragment的泄漏,但對(duì)于presenter,如果希望操作執(zhí)行完之后再被GC,則subscriber/runnable持有的presenter引用,可以認(rèn)為是合理的;
  • MVP scales
    MVP的V可以是整個(gè)屏幕顯示的內(nèi)容,也可以是屏幕上的某個(gè)模塊顯示的內(nèi)容;
  • Not every View needs MVP
    靜態(tài)的頁面并不需要MVP
  • Only display one Model per MVP view
    一個(gè)V顯示多個(gè)M會(huì)為代碼增加復(fù)雜性,尤其是當(dāng)需要保存ViewState時(shí);合理的做法是將V拆分為獨(dú)立的V,每個(gè)V只負(fù)責(zé)顯示一個(gè)M;V可以是fragment,也可以是View/ViewGroup;例子: http://wiki.jikexueyuan.com/project/notes/images/menu-refactored.jpg" alt="menu-refactored.jpg" />
  • Android Services
    Service顯然屬于業(yè)務(wù)邏輯部分,由presenter與之通信是合理的;
  • Use LCE only if you have LCE Views
    LCE還包含loadData,setData,如果沒有這兩個(gè)語義,就不要使用LceView,因?yàn)閷?duì)接口的空實(shí)現(xiàn),有違接口的規(guī)范;
  • Writing custom ViewStates
    當(dāng)需要保存view的狀態(tài)時(shí),定義好ViewState,并在view內(nèi)維護(hù)、檢查;
  • Testing custom ViewState
    View和ViewState都是純Java代碼,可以使用Java的單元測(cè)試方法進(jìn)行測(cè)試;
  • ViewState variants
    有可能View既顯示了數(shù)據(jù),又在進(jìn)行刷新操作,但是ViewState始終只會(huì)處于一個(gè)狀態(tài),通常的做法是為原來的狀態(tài)再加一層修飾,加以區(qū)分;也可以定義一個(gè)新的ViewState;
  • Not every UI representation is a ViewState
    例如:顯示空內(nèi)容,并不是新狀態(tài),而是show content,只不過content為空;
  • Not every View needs a ViewState
    mosby的ViewState通過SavedInstance保存,限制大小為1MB;另外保存的數(shù)據(jù)有可能是過時(shí)的,需要注意;
  • Avoid Fragments on the backstack and child fragments
    fragment的生命周期中可能會(huì)有一些問題,所以盡量避免將fragment放入back stack,或者子fragment;
  • Mosby supports MVP for ViewGroups
  • Mosby provides Delegates
    好處:
    • 可以把MVP模式應(yīng)用到mosby未包含的類中,例如DialogFragment;甚至是第三方庫;
    • 實(shí)現(xiàn)自定義的Delegate,可以改變默認(rèn)Delegate的行為;