1. 程式人生 > >Android架構選型(MVP+DataBinding)

Android架構選型(MVP+DataBinding)

通過程式碼對比,詳細講解MVCMVPMVVM之間應該如何選擇,以及對Android單元測試的探索。本文的側重點在於如何選擇,並沒有對每種架構模式概念展開詳解(網路上這方面的文章有很多,大家可以自行搜尋)。

大綱

· MVC or MVP or MVVM

· 確定選型:MVP + DataBinding

· 單元測試(探索階段)

目的

· 提高開發效率

· 易於測試

· 擁抱變化

· 降低維護成本

Android中的MVC

示例:

展示任務詳情的功能,詳情View層的通過xml來寫的,請求資料相關的程式碼會在Model層提供介面,然後通過ActivityView

Model層進行連線。

程式碼:

Mpublic interface TaskModel {

    void loadTask(String taskId, OnTaskListener listener);

}

V

taskdetail.xml:介面佈局檔案,採用XML進行描述,屬於V層的一部分。

C & V:

TaskDetailActivityC層和Vpublic class TaskDetailActivity {

    private void initView() {

        taskModel.loadTask(taskId, new OnTaskListener() {

            public void onSuccess(Task task) {

                //V層程式碼,但是目前耦合到了C層            

                detailTitle.setText(task.getTitle);

            }

        });

    }  

}

總結:

· 編寫簡單快速,適合含有簡單邏輯的業務,或是demo程式。

· Activity的臃腫:xml作為view層,控制能力太弱,無法動態的改變頁面的內容,只能把程式碼寫在activity中,造成了activity既是Controller

層,又是View層的問題。

· 耦合度較高,需求變化改動大,後續維護成本高。

· Controller混雜著Android程式碼無法Junit

Android中的MVP

示例:

展示任務詳情的功能,詳情View層的通過xmlActivity來完成,請求資料相關的程式碼會在Model層提供介面,然後通過PresenterViewModel層進行連線。

程式碼:

Mpublic interface TaskModel {

    void loadTask(String taskId, OnTaskListener listener);

}

V

taskdetail.xml:介面佈局檔案,採用XML進行描述,屬於V層的一部分。public class TaskDetailActivity implements TaskDetailView {

    public void showTask(Task task) {

        detailTitle.setText(task.getTitle);

    }  

}

P:public class TaskDetailPresenter implements Presenter {

    public void getTask() {

        taskModel.loadTask(taskId, new OnTaskListener() {

            public void onSuccess(Task task) {

                //通過介面回撥到V層更新UI

                taskDetailView.showTask(task);

            }

        });

    }  

}

總結:

· 減少各層之間耦合,易於後續的需求變化,降低維護成本。

· Presenter層獨立於Android程式碼之外,可以進行Junit測試。

· 介面和類較多,互相做回撥,程式碼臃腫。

· Presenter層與View層是通過介面進行互動的,介面粒度不好控制。

Android中的MVVM

示例:

展示任務詳情的功能,詳情View層的通過xmlActivity來完成,請求資料相關的程式碼會在Model層提供介面,然後通過ViewModelViewModel層進行連線。

程式碼:

Mpublic interface TaskModel  ...

    void loadTask(String taskId, OnTaskListener listener);

V

taskdetail.xml:介面佈局檔案,採用XML進行描述,繫結規則在xml中進行定義。

TaskDetailActivityActivity主要是初始化和補充的功能。

VM

TaskDetailViewModel {

        public void getTask() {

              taskModel.loadTask(taskId, new OnTaskListener() {

                    public void onSuccess(Task task) {

                        //通過繫結技術更新UI,做到資料獨立於UI

                        taskDeatailViewBinding.setTask(task);

            }

              });

        }  

}

總結:

· MVP比較像,主要區別在於ViewViewModel / Presenter之間的通訊

· 相比MVP優勢是通過DataBinding技術為VMV層進行資料繫結,提高開發效率,由於目前繫結技術的侷限,V層一些介面的處理還是需要Activity的輔助。

· VM層摻雜Android程式碼無法進行Junit測試。

確定選型

通過以上對比,選擇了MVP+DataBinding,此架構模式基於MVP,並使用DataBinding庫來顯示資料並繫結View。它並不遵循嚴格的MVVMMVP模式,因為它同時使用了ViewModelPresenter

DataBinding

這是我上篇文章我們為什麼要使用DataBinding,裡面通過程式碼的對比,總結說明為什麼要使用DataBinding的技術,有興趣的同學可以閱讀一下,在這裡我把文章裡的一小段總結貼出來:

DataBinding為資料驅動:資料變化後自動更新UI;事件處理:直接找到目標例項處理使用者操作的事件。這樣我們就不需要和UI或者控制元件打交道,只需要在java程式碼中處理業務邏輯就好了,非常清晰,其餘的統一交給binding庫去完成。降低了程式碼耦合度,使得資料獨立於UI,對以後程式的變化和維護都有積極的影響。

MVP+DataBinding

示例:

展示任務詳情的功能,資料和事件繫結與基礎MVP程式碼的對比。

程式碼:

//普通MVP   任務詳情程式碼示例:public void onCreateView(...) {

    detailTitle = (TextView) root.findViewById(R.id.task_detail_title);

    detailComplete = (CheckBox) root.findViewById(R.id.task_detail_complete);

    detailComplete.setOnCheckedChangeListener(

           (cb, isChecked) -> presenter.completeChanged(task, isChecked)

    );

}@Overridepublic void showDescription(String title) {

    detailTitle.setText(title);

}//xml檔案省略...

//MVP+DataBinding   任務詳情程式碼示例:@Overridepublic void showTask(Task task) {

    viewDataBinding.setTask(task);

}//可以通過佈局檔案直接繫結到資料模型的屬性(xml檔案)

<TextView

    android:id="@+id/task_detail_title"

    android:text="@{task.title}" />//事件繫結同樣可以直接在佈局檔案中實現(xml檔案)

<CheckBox

    android:id="@+id/task_detail_complete"

    android:checked="@{task.completed}"

    android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

總結:

· DataBinding庫提高了開發效率,使得xml佈局檔案用於將資料繫結到UI元素,也可以繫結一個action handlerPresenter)處理使用者操作的事件,可以觀察和設定資料,以便在需要時自動更新(雙向繫結)。

· 需要對ViewPresenter兩層做測試,增加工作量。

· 目前Android StudioDatabing的支援不是太好(報錯和程式碼自動生成)

單元測試(探索階段)

Presenter

不需要Android環境,因此使用Junit測試即可

· JUnitJava語言的單元測試框架

· Mockito:模擬物件的測試框架

View

使用Google建議的Espresso進行UI的測試(需要依賴Android環境)

· AndroidJUnitRunnerAndroid 且與 JUnit 4 相容的測試執行器

· Espresso:功能性 UI 測試框架

問題

就目前實踐過程中,會發現需要為測試寫一些額外的方法,不是太舒服。並且寫兩層測試,工作量變大。還有覆蓋率以及維護的問題,一直在探索最佳實踐,會在以後的文章裡面和大家分享。

本片文章來自於自己的程式設計實戰,寫的不好的地方請大家幫忙指正,希望能幫助大家選到合適自己的架構模式。

謝謝閱讀。

相關推薦

Android架構選型(MVP+DataBinding)

通過程式碼對比,詳細講解MVC,MVP,MVVM之間應該如何選擇,以及對Android單元測試的探索。本文的側重點在於如何選擇,並沒有對每種架構模式概念展開詳解(網路上這方面的文章有很多,大家可以自行搜尋)。 大綱 · MVC or MVP or MVVM? · 確

Android Mvp+DataBinding架構模式詳解

MVP模式的使用 一. MVC與MVP設計模式的區別 MVC:使用者發出事件的時候,view層發出指令到controller層,controller層去通知model層更新資料,更新完資料後返回給view層展示。 MVC反映到Android工程上 V:

android -------- MVP+DataBinding 的使用

ondestroy ast tof tab pat ins result hvie eat 今天來說說MVP+DataBinding 的使用 以一個登錄案例來講解 布局:(ConstraintLayout 作為根布局) <layout>

Android架構:2018 主流大廠MVP模式是怎樣?

1.前言 MVP 模式是目前運用最多的一種開發模式,Presenter作為Model與View的橋樑,負責業務邏輯、操作資料等工作。這樣把model與view實現了 分離(解耦合) ,有利於 結構變得更簡單 ,以便開發者更 容易管理與維護 自身的程式碼。 雖然MVP具

Android架構】基於MVP模式的Retrofit2+RXjava封裝之常見問題(四)

###先回顧下之前的 【Android架構】基於MVP模式的Retrofit2+RXjava封裝(一) 【Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案下載(二) 【Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案上傳(三)

Android架構】基於MVP模式的Retrofit2+RXjava封裝(一)

#最近有個新專案要做,搭建框架的時候,順便梳理了下MVP模式,特此記錄,歡迎大家指正。 專案地址GitHub 一 、首先是依賴 compile 'com.google.code.gson:gson:2.8.0' compile 'com.squareup.ok

Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案上傳(三)

最近手頭事比較多,抽個空把之前系列也補充一下。 先回顧下之前的 【Android架構】基於MVP模式的Retrofit2+RXjava封裝(一) 【Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案下載(二) 今天要說的是檔案上傳 1.單圖上

Android架構】基於MVP模式的Retrofit2+RXjava封裝之檔案下載(二)

上篇中我們介紹了基於MVP的Retrofit2+RXjava封裝,還沒有看的點選這裡,這一篇我們來說說檔案下載的實現。 首先,我們先在ApiServer定義好呼叫的介面 @GET Observable<ResponseBody> downloadFile(@

Android基礎架構MVP模型

最近工作上碰到了一個Android專案需要重構,因為之前的專案是MV模式,UI和業務混雜在一起,加上最初開發這個專案的程式設計師離職,這個專案已經處於維護十分困難的情況,最終選擇重構。考慮到本專案屬於業務複雜度中等的專案,而且希望新的專案具有鮮明的UI-業務-資

Android 自定義Mvp架構

/** * Author:DoctorWei * Time:2018/12/4 20:34 * Description: * email:[email protected] */ 1.定義BaseView回撥介面 public interface BaseView { } 2

Android中MVC架構MVP架構的實踐詳解 通俗易懂的Demo

前言 相信從事軟體開發的夥計們肯定熟悉或者聽說過專案架構,比如要新開發一個APP或者Web專案,首先考慮的就是專案需要設計什麼樣的架構,MVC還是MVP呢?MVC和MVP具體是怎麼體現的,有哪些優點,哪些缺點呢? 為什麼需要架構設計 假如我們不需要架構設計,那

Android 架構設計:MVC、MVP、MVVM和元件化

MVC、MVP和MVVM是常見的三種架構設計模式,當前MVP和MVVM的使用相對比較廣泛,當然MVC也並沒有過時之說。而所謂的元件化就是指將應用根據業務需求劃分成各個模組來進行開發,每個模組又可以編譯成獨立的APP進行開發。理論上講,元件化和前面三種架構設計不是

android 架構模式MVC,MVP,MVVM

  從只會實現功能的“碼農”到軟體工程師、設計師的過渡。   MVP/MVVM架構的優點和缺點?它的使用場景是什麼?   MVC是一種框架模式而非設計模式,GOF把MVC看作是3種設計模式:觀察者模式、策略模式與組合模式的合體,而核心是觀察者模式。簡而言之,框架是大智慧,用

Android程式碼架構MVP

1、引言 9月到了,不知道同學們的暑假作業有沒有抄完,想到學校已經離我遠去,還真的有點傷感呢,不過沒關係,即使離開了學校咱還是可以繼續學習是不是,好吧,讓我們來開始今天的學習MVP架構 2、為什麼要學習MVP架構? 相信很多同學之前都跟我這個菜雞一樣,寫程式碼的時候都是想

Android架構篇--MVP模式的介紹篇

跳過 fan string btn 開始 tex 維護 服務器 run 摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趨勢,筆者曾經在商業項目中從零開始大規模采用過MVP模式對項目進行開發。在使用MVP模式進行開發的時候發現項目的結構模式對開發是有一定的影

Android開發學習--MVP模式入門

handle ges span findview list pass override appcompat over 1、模型與視圖完全分離,我們可以修改視圖而不影響模型2、可以更高效地使用模型,因為所有的交互

Android開發之旅3:android架構

通過 圖集 例如 sqlit 組件 mil 大小 簡化 .html 引言 通過前面兩篇: Android 開發之旅:環境搭建及HelloWorld Android 開發之旅:HelloWorld項目的目錄結構 我們對android有了個大

Android架構師之路 網絡層架構設計與實戰

安卓 第1章 課前須知介紹如何去學習,課程適合的人群、怎麽才能融會貫通第2章 主流網絡框架分析常用網絡框架介紹,分析volley 、Android-async-http、Afinal框架、xUtils、okhttp、retrofit、優有點缺點、教會選擇一個框架的標準是什麽?第3章 http協議詳解介紹htt

一款成功的全球服遊戲該如何進行架構選型與設計?

建議 滿足 異步 family tom 擁塞 支持 印度 特點 全球服遊戲如今正在成為出海遊戲的主要考慮模式,跨國對戰、全球通服打破國界的限制,將不同地區不同語言的玩家放在一起合作/競技,成功吸引了大量玩家的關註,並逐漸成為主流的遊戲玩法。遊戲廠商們也在嘗試采用一地部署多地

千億級數量下日誌分析系統的技術架構選型

優劣勢 大數據應用 aci 是我 根據 上下文 建議 strong 自動 ?? 隨著數據已經逐步成為一個公司寶貴的財富,大數據團隊在公司往往會承擔更加重要的角色。大數據團隊往往要承擔數據平臺維護、數據產品開發、從數據產品中挖掘業務價值等重要的職責。所以對於很多大數據工程師