$30 off During Our Annual Pro Sale. View Details »

Effective Android Architecture - MWDC

Effective Android Architecture - MWDC

Yet another talk on Android architecture at MWDC 2015

Richa

July 16, 2015
Tweet

More Decks by Richa

Other Decks in Programming

Transcript

  1. EFFECTIVE ANDROID
    ARCHITECTURE

    View Slide

  2. Hi, I am Richa

    View Slide

  3. EFFECTIVE ANDROID
    ARCHITECTURE

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. Who all has ever used
    MVC?

    View Slide

  10. MVC

    View Slide

  11. MVP ?
    MVC ?
    MVVM ?

    View Slide

  12. MODEL VIEW CONTROLLER
    Interact with DB Render Model Handle view events
    Update model
    Invoke next UI
    Table of Responsibilities

    View Slide

  13. Mobile
    Web
    Desktop

    View Slide

  14. View Slide

  15. MODEL VIEW CONTROLLER
    Interact with DB Render Model Handle view events
    Interact with network Manage view state Update model
    Navigation
    Interact with system
    components
    Handle system events
    Update view on system
    events

    View Slide

  16. Model
    public class CourseModel {
    Course getFromDatabase() {
    // fetch from db, or local cache
    }
    Course getFromNetwork() {
    // fetch from apis, cache when possible
    }
    }

    View Slide

  17. View
    public class ExpandableCourseListActivity
    {
    void onSaveInstanceState(Bundle b) {
    // save all expanded states
    }
    }

    View Slide

  18. Controller
    void onClick() {}
    void onModelUpdated() {}
    void onNewNotification() {}
    void onLocationUpdated(Location loc) {}
    void takePhoto(Activity context) {}
    void launchView(Activity context ) {}

    View Slide

  19. View Slide

  20. View Slide

  21. MVC
    ??

    View Slide

  22. MODEL VIEW CONTROLLER
    Interact with DB Render Model Handle view events
    Interact with network Manage view state Update model
    Navigation
    Interact with system
    components
    Handle system events
    Update view on system
    events

    View Slide

  23. Interactor?

    View Slide

  24. JUnit +
    Mocking

    View Slide

  25. MODEL VIEW CONTROLLER INTERACTOR
    Retrieve data from
    DB
    Render Model
    Handle view
    events
    Interact with
    external entities
    Retrieve data from
    network
    Manage view
    state
    Navigation
    Forward system
    events to view
    Forward model
    updates to view

    View Slide

  26. View Model ?

    View Slide

  27. JUnit +
    Mocking
    Android +
    Mocking
    Espresso +
    Mocking

    View Slide

  28. MODEL VIEW CONTROLLER INTERACTOR VIEW MODEL
    Retrieve data
    from Network
    Render View
    Model
    Handle view
    events
    Interact with
    external
    entities
    View state /
    behavior
    Retrieve data
    from network
    Navigation
    Update view
    state

    View Slide

  29. Presenter ?

    View Slide

  30. MODEL VIEW PRESENTER INTERACTOR VIEW MODEL
    Retrieve data
    from DB
    Render View
    Model
    Handle view
    events
    Interact with
    external
    entities
    View state /
    behavior
    Retrieve data
    from network
    Navigation
    Update view
    state

    View Slide

  31. Espresso +
    Mocking
    JUnit +
    Mocking
    JUnit +
    Mocking
    Android +
    Mocking
    Data Source

    View Slide

  32. ENTITIES VIEW PRESENTER INTERACTOR VIEW MODEL
    Get data from
    Data Sources
    Render View
    Model
    Handle view
    events
    Interact with
    external
    entities
    View state /
    behavior
    Navigation
    Update view
    state

    View Slide

  33. FlowController ?

    View Slide

  34. Android +
    Mocks

    View Slide

  35. ENTITIES VIEW PRESENTER INTERACTOR VIEW MODEL
    FLOW
    CONTROLLER
    Get data
    from Data
    Sources
    Render View
    Model
    Handle view
    events

    Update view
    state
    Interact

    with external
    entities
    View state /
    behavior
    Navigation

    View Slide

  36. View Slide

  37. Apply Dependency
    Inversion

    View Slide

  38. View Slide

  39. View Slide

  40. View Slide

  41. S ingle Responsibility Principle
    O pen/Closed Principle
    L iskov Substitution Principle
    I nterface Segregation Principle
    D ependency Inversion Principle

    View Slide

  42. Architecture is about
    Intents not Frameworks
    - Uncle Bob

    View Slide

  43. View Slide

  44. Implementation in
    Practice

    View Slide

  45. Activity
    Video
    Module
    Activity
    Quiz
    Module
    Navigation
    Main
    Activity
    Shell
    App
    Catalog
    Activity
    Catalog
    Module
    url Intent
    Intent
    Register
    with url
    Modules

    View Slide

  46. Deep links
    Shell
    App
    Video
    Activity
    Video
    Module
    Catalog
    Activity
    Catalog
    Module
    register register
    url
    Intent
    Intent

    View Slide

  47. ViewModels Save/Restore
    View
    Models
    Presenter
    Retainable
    Fragments
    Parcelables
    onSaveInstanceState
    onSaveInstanceState

    View Slide

  48. Chain of Responsibility
    View
    Presenter
    Interactor
    Network
    Persistence •Result
    •Error

    View Slide

  49. View Slide

  50. The Cons

    View Slide

  51. Dealing with context
    Presenter(Context context)
    Interactor(Context context)
    NetworkClient(Context context)
    PersistenceClient(Context context)
    context.getSystemService(“SERVICE”)
    context.startActivity(intent)
    context.startActivityForResult(intent)

    View Slide

  52. Tedium
    ~ 7 classes per feature/module

    View Slide

  53. Adopting as a team
    Educating new hires

    View Slide

  54. Key Takeaways

    View Slide

  55. Ship the latest ideas

    View Slide

  56. Refactor or Not?

    View Slide

  57. Validate

    View Slide

  58. Iterate, Iterate, Iterate

    View Slide

  59. Code Demo - Sample app

    View Slide

  60. Source Code
    https://github.com/richk/
    CourseraDemoApp

    View Slide

  61. Classes
    • MainActivity
    • CatalogFlowController
    • CatalogActivity
    • CatalogPresenter
    • CatalogViewModel
    • CatalogInteractor

    View Slide

  62. MainActivity
    void onCreate() {
    CatalogFlowController.getInstance()
    .launchCatalogActivity();
    }

    View Slide

  63. CatalogFlowController
    void launchCatalogActivity(Context c) {
    Intent intent = …;
    c.startActivity(intent)
    }

    View Slide

  64. CatalogActivity
    CatalogPresenter presenter;
    void onCreate() {
    presenter = new CatalogPresenter(this);
    }

    View Slide

  65. CatalogActivity
    void onResume() {
    Action1 action = ;
    presenter.subscribeToUpdates(action)
    }

    View Slide

  66. CatalogActivity
    void onPause() {
    presenter.unsubscribeToUpdates();
    }

    View Slide

  67. CatalogPresenter
    CatalogInteractor interactor;
    CatalogPresenter(Context c) {
    viewModel = new CatalogViewModel();
    interactor = new CatalogInteractor(c);
    loadCatalog();
    }

    View Slide

  68. CatalogPresenter
    void loadCatalog() {
    interactor.loadCourses()
    .subscribe(new Action1<>() {
    @Override
    public void call(List courses) {
    // action
    }
    });
    }

    View Slide

  69. CatalogPresenter
    void subscribeToUpdates(Action1 a) {
    viewModel.subscribeToUpdates(a);
    }
    void unsubscribeToUpdates() {
    viewModel.unsubscribeToUpdates();
    }

    View Slide

  70. CatalogViewModel
    public final BehaviorSubject catalog =
    BehaviorSubject.create();
    public void subscribeToCatalog(Action1 action) {
    catalog.subscribe(action);
    }
    public void unsubscribeToCatalog() {
    catalog.unsubscribe();
    }

    View Slide

  71. CatalogInteractor
    Context mContext;
    public CatalogInteractor(Context context) {
    mContext = context;
    }
    public Observable loadCatalog() {
    return catalogDataSource.loadCatalog();
    }

    View Slide

  72. View Slide

  73. View Slide

  74. Coursera is hiring!

    View Slide

  75. Questions ?

    View Slide

  76. @richa123
    [email protected]
    richk
    in/richak
    Thank You

    View Slide