前言
首先上篇文章講到的是依賴注入(dagger),然后我使用rxjava, retrofit, dagger2, mvp做了一個練手app——githubQuery寺惫,算是第一次嘗試吧形娇。再是mvp用的是我自己的一個框架EasyMVP仔粥。然后在model層我學(xué)習(xí)了一個老外的想法挠铲,抽出來了一個叫datamanager的東西冕屯,它屬于model層,用于過濾和操作從model層得到的數(shù)據(jù)拂苹。主要的目的是方便dagger提供單一的數(shù)據(jù)層依賴安聘,并且減少presenter層的代碼量。這幾個庫都不好上手瓢棒,但是我覺得多用多寫就好了浴韭,我現(xiàn)在已經(jīng)在用這套方法在做別的項目了。
依賴注入圖
可以看到我在ActivityComponent中的API是拋出了很多的inject方法用來注入其他所有的activity脯宿,但是這種做法適合小項目念颈,項目大了之后,如果每個activity的依賴需求不同還是很麻煩连霉,所以最好一個activity一個component榴芳。對照這個圖看代碼基本問題不大嗡靡,我記得當時對于@Inject這個注解的理解不是很深刻!
DataManager相當于是model所有數(shù)據(jù)源的代理層翠语,作為ApplicaitonComponent的API暴露出來叽躯,然后作為ActivityComponent的依賴注入進去财边。
@Inject()
如果@Inject標注的是構(gòu)造方法肌括。那么表明這個類的對象也是依賴注入圖里面的一員,前提是這個構(gòu)造函數(shù)里面的所有參數(shù)都是來自依賴注入圖(@provide)酣难。
項目架構(gòu)圖
注意谍夭,我的mvp開發(fā)模式是將activity,fragment作為presenter。
在這里DataManager就是整個架構(gòu)的核心了憨募。因為我們使用的是rxjava+retrofit紧索,自然要有一種流的思想。你可以這樣想菜谣,一個數(shù)據(jù)流從hepler類流到datamanager珠漂,然后在這里做你所需要的變換。比如你需要把所有學(xué)生姓名的首字母大寫尾膊,但是api返回的元數(shù)據(jù)是沒有大寫的媳危。這樣做其實就是為了給activity等presenter瘦身。我貼出我的DataManager的代碼:
/**
* Created by Zane on 16/1/26.
*/
@Singleton
public class DataManager {
private GithubApiService githubApiService;
private Context mContext;
@Inject
public DataManager(@ContextType("MyApplication")Context context, GithubApiService githubApiService){
this.githubApiService = githubApiService;
mContext = context;
}
//對用戶信息進行一層過濾或者操作,然后在presenter中去調(diào)用這個方法.
//當然我在這里做的操作毫無意義冈敛,但是如果有需要還是會減少activity活著fragment中的代碼量待笑。
//presenter只負責調(diào)用。然后獲得數(shù)據(jù)而不管代碼的實現(xiàn)
public Observable<Users> getUserInfo(String userName){
return githubApiService.getUserInfo(userName)
.map(new Func1<Users, Users>() {
@Override
public Users call(Users users) {
String name = users.getName();
users.setName(name + " datamanager");
return users;
}
})
.flatMap(new Func1<Users, Observable<Users>>() {
@Override
public Observable<Users> call(final Users users) {
return Observable.create(new Observable.OnSubscribe<Users>() {
@Override
public void call(Subscriber<? super Users> subscriber) {
subscriber.onNext(users);
}
});
}
});
}
//對庫的信息進行一層過濾
public Observable<List<Repos>> getReposInfo(String userName){
return githubApiService.getReposInfo(userName);
}
}
我將用戶的名字后面加了一個datamanager抓谴,在這里雖然沒什么意義暮蹂,但是要體現(xiàn)datamanager的作用所在。
不足
沒有任何東西是完美的癌压。
這里如果只有一個DataManager的話仰泻,那么如果數(shù)據(jù)量一大,這個類會變得非常的臃腫和復(fù)雜滩届。
所有東西都是在不斷嘗試吧集侯,貼出這個思想創(chuàng)始人的文章:Android Application Architecture
好了,去上課了丐吓。浅悉。近代史!