MvcBind快速開發框架,基於mvc+databinding爲基礎製做的輕量級快速開發基礎框架。目標只有一個:快!上手快,理解快,開發快,維護快。java
軟件架構說明
框架基於經典的MVC模式,這裏爲何不用mvp或者是mvvm呢?後二者筆者也有大量項目實踐,實際使用中發現,二者的開發速度都比較慢(較mvc),尤爲是mvp,採用了接口解耦,開發中須要寫更多的類,聲明更多的接口方法,而後再去實現這些方法,開發效率不佳。固然,不能否認的是,就後期維護來講,mvp和mvvm確實優於傳統mvc模式,當時這種優點僅存在於mvc寫的不規範的狀況下,實際上規範化的mvc模式代碼,維護並不會比後二者差太多。並且,事實上嚴格意義上來講,大部分人初學安卓的寫法,並不能算是mvc,爲何這麼說呢,咱們不妨來看看mvc的交互圖: android
public class TestActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.tv_date);
mTextView.setText(System.currentTimeMillis());
}
}
複製代碼
這裏只是寫個簡單的示例,和上圖對比能夠發現,大部分人所謂的mvc連model模塊類都沒有,全部的視圖、數據、邏輯代碼所有堆疊在activity或者fragment中,那麼後期維護困難就必然了。就簡單來說,安卓中的mvc也該是由佈局(view)、activity(control)、數據類(model)這三者構成纔對,事實上你若是這麼寫了,明顯比上述代碼更好維護。可是,僅僅這樣仍是不夠的,由於安卓中的佈局xml文件職能比較少,不少東西並無辦法在xml中完成,這就形成你不得不寫在activity(control)中,這樣就又會形成view與control的分工混亂了,那麼,如何解決這一問題?
MvcBind採用吸收mvp的模式核心思想,明確分工,寫一個頁面時包含三個模塊,model(數據類)、control(activity或fragment)、view(佈局xml+view類)。這裏與傳統mvc模式的區別在於view由xml和一個獨立的view控制類組成,與mvp的區別在於MvcBind不加入接口解耦機制,mvc三者之間能夠直接調用其餘方的公共方法。mvp的接口解耦機制過於冗餘,並且就效果來講主要仍是看使用者的功力,再好的mvp框架到初學者手中也是寫的一團糟,因此本庫直接去掉了mvp中的接口解耦機制,而保留了mvp基本的模塊解耦思想。同時,爲了減小模板代碼,引入了databinding機制,view類中不須要任何findview代碼。
簡單的介紹就說到這裏,下面說說MvcBind的快體如今哪裏,首先,假如咱們須要建立一個activity,使用本框架你只須要:git
如圖所示,只須要簡單兩步你就能夠得到mvc三個類和一個佈局文件,4個文件中的初始代碼展現:github
public class TestActivityControl extends BaseActivity<TestActivityModel, TestActivityView> {
@Override
public void init (Bundle savedInstanceState) {
}
}
public class TestActivityModel extends BaseModel {
@Override
public void init (IControl control) {
}
}
public class TestActivityView extends BaseView<ActivityTestBinding> {
@Override
public void init (IControl control) {
mBind.setControl(control);
}
}
複製代碼
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" >
<data>
<variable name="control" type="com.xujl.fastlib.base.IControl"/>
</data>
<!-- -->
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
</LinearLayout>
</layout>
複製代碼
僅僅兩步你就能夠開始寫本身的業務代碼,不再用像寫mvp同樣去寫那麼多類和接口,上述功能的實現參考筆者的另外一篇文章:As模板
固然,你也大可沒必要關心上述功能如何實現的,由於本庫已經給出模板,位於倉庫/工具目錄下,只須要複製到as對應目錄重啓便可,具體使用方法參考使用說明。json
項目地址:gitee.com/biyouji_adm…架構
基礎功能:
1.下載項目源碼到本地
2. 配置你的項目根build.gradle文件(參考下載的源碼)
3. 導入fastlib到你的項目,並添加爲你項目的依賴module
mvc
附加功能:
1.activity/fragment模板
模板位置:源碼目錄/工具/快速生成類模板
具體使用說明參考文件夾下的word文檔
2.快捷生成bind數據類
什麼是bind數據類?都知道dataBinding須要一個數據實體進行綁定,一般有兩種方法,一種是使用ObservableField對字段進行包裝,可是這種方法很是麻煩,並且咱們的實體一般是來源於json,json解析確定是沒法支持ObservableField類型的,以下:app
public ObservableField<String> name = new ObservableField<>();
複製代碼
還有一種就是實體類繼承BaseObservable類,而且須要綁定的字段須要作以下處理:框架
private String name;
@Bindable
public String getName () {
return name;
}
public void setName (String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
複製代碼
和第一種寫法相比,可能也不便捷,但優點在於json解析出來就能夠直接和view進行綁定了,不用再去set一次值。可是大量的字段,重複添加這些東西,仍是很浪費時間的,這時候就輪到插件出場了。
插件目錄:源碼/工具/DbSetter.jar
插件安裝方法自行百度,不是這裏須要介紹的,插件的源碼也在工具/DbSetter-master下,若是想對插件做出優化,能夠自行修改
插件使用:
mvvm
1.上手快
爲何上手快?由於首先就使用了你們熟知的mvc模式,不須要太多額外的學習成本,本框架最大的學習成本應該是對數據綁定的理解,不過這個相比去吃透mvp、mvvm仍是簡單不少。
2.理解快
框架源碼簡單,沒有太多花裏胡哨的東西,只要肯花個半天左右的時間來看,就能一目瞭然總體設計思路。
3.開發快
基於模板建立activity/fragment和自動生成bind數據類的setter/getter,能夠節省大量首次開發時間,千萬不要小看這部分建立的時間,一個新項目通常30個activity,10個左右的fragment,若是根據框架建立activity相關類和佈局預計5分鐘的話一個項目光是寫這些模板代碼都要近200分鐘左右,這麼算是比較保守的了,實際時間可能還不止。
若是你覺得開發快僅僅是上面兩點就大錯特錯了,上面不過是冰山一角,下面將詳細說明,本庫如何實現快速開發:
無需再寫佈局id,下面的代碼,估計你們在各類框架中常常見:
@Override
public int initContentView (Bundle savedInstanceState) {
return R.layout.activity_card_goods_list;
}
複製代碼
固然,各類框架的方法名可能有必定出入,可是目的基本都是同樣,子類傳遞佈局id給base類進行佈局加載,這麼作無可厚非,可是寫的多了,就很煩這種代碼,若是你沒有用模板自動生成就更煩,每新增一個頁面就要花個2秒的時間寫這種沒養分的代碼,那麼本庫中如何處理呢?
public class LoadingFragmentView extends BaseView<FragmentLoadingBinding> {
@Override
public void init (IControl control) {
}
}
複製代碼
你會發現沒有返回任何佈局id,可是運行時頁面能夠準確加載佈局R.layout.fragment_loading,具體原理,這裏不細說,有興趣的直接去看源碼,沒有幾行代碼。整體來講這個功能的實現基於兩點:
1.標準化命名,mvc三個模塊以及佈局的命名有着嚴格要求,好比上面的LoadingFragmentView他對應的其餘文件必定是LoadingFragmentControl、LoadingFragmentModel、R.layout.fragment_loading。固然你大可沒必要擔憂命名出錯,由於,這些文件都是模板生成的。
2.反射,有了標準化的命名,咱們在基類就能夠很容易的經過反射獲取類名,再經過類名拼接成佈局文件id,而後進行佈局加載了!
多種功能實例參考
public class ActivityModeFragmentControl extends BaseFragment {
@Override
public void init (Bundle savedInstanceState) {
}
}
複製代碼
頁面設計太複雜,或者各類緣由,不能或者不想使用databinding?沒問題!
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="本頁面沒有使用dataBinding" />
</LinearLayout>
public class NoBindingFragmentView extends BaseView {
@Override
public LayoutBuilder configLayout () {
return super.configLayout().setEnableDataBinding(false);
}
@Override
public void init (IControl control) {
}
}
複製代碼
既不想不用binding也不想用mvc,只想用最簡單的acivity/fragment?沒問題!
public class SimpleModeFragmentControl extends BaseFragment {
@Override
protected BaseView createDefaultView () {
return new BaseView() {
@Override
public void init (IControl control) {
}
@Override
public LayoutBuilder configLayout () {
return super.configLayout().setEnableDataBinding(false);
}
};
}
@Override
public void init (Bundle savedInstanceState) {
}
}
複製代碼
固然了,以上是本庫支持的模式,可是一般狀況下很是不建議關閉databinding。