Android的架構(gòu)主體演變
在過去Android一直在MVC、MVP中探索。在2019基本沒有誰再去糾結(jié)這兩個(gè)架構(gòu)了,因?yàn)锳ndroid的Jetpack提供了MVVM架構(gòu),說到MVVM架構(gòu)我第一時(shí)間想到剛剛畢業(yè)的時(shí)候,在WPF的window開發(fā)中使用到MVVM的數(shù)據(jù)綁定。如果你是一個(gè)初學(xué)者我的建議是直接忽略MVP架構(gòu),直接入門MVC,開發(fā)MVVM。
最佳架構(gòu)
對于MVVM,google提供了Jetpack組件。成為Android最佳架構(gòu)實(shí)踐??梢酝ㄟ^以下網(wǎng)址學(xué)習(xí)和探索:https://developer.android.com/jetpack 。Jetpack組件已經(jīng)植入了Android的SDK,從這一點(diǎn)可以看出最佳架構(gòu)不是徒有空名的,那些還在觀念意識上不接受的就快點(diǎn)轉(zhuǎn)換思維吧。
學(xué)習(xí)Jetpack中的設(shè)計(jì)思想
公司的主體Android架構(gòu)已經(jīng)切換到了MVVM結(jié)構(gòu)了,而且App運(yùn)行良好,優(yōu)勢也漸漸凸顯。在這里我和大家分享一下我眼中的Jetpack組件值得學(xué)習(xí)的切入點(diǎn)主要有兩點(diǎn):構(gòu)建對象管理器、數(shù)據(jù)綁定。
構(gòu)建對象管理器
對于對象的生成和銷毀的管理一直以來都是各大架構(gòu)的一個(gè)主題功能。歸根結(jié)底就是一個(gè)工廠模式,在Jetpack中我們也看到這個(gè)設(shè)計(jì)模式的應(yīng)用,在ViewModelProviders和RepositoryProviders。先不看這個(gè)兩個(gè)類的實(shí)現(xiàn),我們也可以自己去虛擬一下這個(gè)兩個(gè)類的實(shí)現(xiàn)、毫無疑問就是一個(gè)構(gòu)造器,就是使用一個(gè)類的輔助new class。根據(jù)以往的知識我們需要解決的問題有兩個(gè):
- 構(gòu)造一個(gè)類
- 傳入構(gòu)造的參數(shù)
構(gòu)造器的好處在呢?一般想到的是統(tǒng)一構(gòu)造,其實(shí)這只是皮毛,最重要的是,統(tǒng)一的構(gòu)造器對于對象管理服務(wù)器,Jetpack主要是考慮到對于ViewModel和Repository的生命周期的綁定。以往我們的Activity的生命周期歷程相對來說是復(fù)雜的,對于一般的對象我們只關(guān)注創(chuàng)建、銷毀即可。同理ViewModel和Repository也是這樣的生命周期也是簡化的只有創(chuàng)建和銷毀。
對于傳入構(gòu)造參數(shù)主要是使用了
public final class Class<T>{
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
return getConstructor0(parameterTypes, Member.PUBLIC);
}
}
數(shù)據(jù)綁定
數(shù)據(jù)的綁定有XML綁定,數(shù)據(jù)變化觀察綁定。xml布局綁定使用了DataBinding,數(shù)據(jù)觀察綁定使用了類似觀察者模式和代碼生成器。
對于觀察者Jetpack組件使用了一個(gè)非常簡約的代碼主要是基于Observable去拓展
public interface Observable {
/**
* Adds a callback to listen for changes to the Observable.
* @param callback The callback to start listening.
*/
void addOnPropertyChangedCallback(OnPropertyChangedCallback callback);
/**
* Removes a callback from those listening for changes.
* @param callback The callback that should stop listening.
*/
void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback);
/**
* The callback that is called by Observable when an observable property has changed.
*/
abstract class OnPropertyChangedCallback {
/**
* Called by an Observable whenever an observable property changes.
* @param sender The Observable that is changing.
* @param propertyId The BR identifier of the property that has changed. The getter
* for this property should be annotated with {@link Bindable}.
*/
public abstract void onPropertyChanged(Observable sender, int propertyId);
}
}
代碼基本結(jié)構(gòu)如下
生成代碼部分,可以去看看AbstractProcessor的使用,這個(gè)非常有意思學(xué)習(xí)完后基本可以玩轉(zhuǎn)注解的高階了。
最后
寫的東西很皮毛,關(guān)鍵是2020年了。技術(shù)飛速發(fā)展,其實(shí)自己還是遠(yuǎn)點(diǎn)踏步呀。