前言
首先上篇文章講到的是依賴注入(dagger),然后我使用rxjava, retrofit, dagger2, mvp做了一個(gè)練手app——githubQuery,算是第一次嘗試吧。再是mvp用的是我自己的一個(gè)框架EasyMVP。然后在model層我學(xué)習(xí)了一個(gè)老外的想法,抽出來了一個(gè)叫datamanager的東西,它屬于model層,用于過濾和操作從model層得到的數(shù)據(jù)。主要的目的是方便dagger提供單一的數(shù)據(jù)層依賴,并且減少presenter層的代碼量。這幾個(gè)庫都不好上手,但是我覺得多用多寫就好了,我現(xiàn)在已經(jīng)在用這套方法在做別的項(xiàng)目了。
依賴注入圖
gtihubquery依賴注入圖1.png
可以看到我在ActivityComponent中的API是拋出了很多的inject方法用來注入其他所有的activity,但是這種做法適合小項(xiàng)目,項(xiàng)目大了之后,如果每個(gè)activity的依賴需求不同還是很麻煩,所以最好一個(gè)activity一個(gè)component。對(duì)照這個(gè)圖看代碼基本問題不大,我記得當(dāng)時(shí)對(duì)于@Inject這個(gè)注解的理解不是很深刻!
DataManager相當(dāng)于是model所有數(shù)據(jù)源的代理層,作為ApplicaitonComponent的API暴露出來,然后作為ActivityComponent的依賴注入進(jìn)去。
@Inject()
如果@Inject標(biāo)注的是構(gòu)造方法。那么表明這個(gè)類的對(duì)象也是依賴注入圖里面的一員,前提是這個(gè)構(gòu)造函數(shù)里面的所有參數(shù)都是來自依賴注入圖(@provide)。
項(xiàng)目架構(gòu)圖
注意,我的mvp開發(fā)模式是將activity,fragment作為presenter。
在這里DataManager就是整個(gè)架構(gòu)的核心了。因?yàn)槲覀兪褂玫氖莚xjava+retrofit,自然要有一種流的思想。你可以這樣想,一個(gè)數(shù)據(jù)流從hepler類流到datamanager,然后在這里做你所需要的變換。比如你需要把所有學(xué)生姓名的首字母大寫,但是api返回的元數(shù)據(jù)是沒有大寫的。這樣做其實(shí)就是為了給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;
}
//對(duì)用戶信息進(jìn)行一層過濾或者操作,然后在presenter中去調(diào)用這個(gè)方法.
//當(dāng)然我在這里做的操作毫無意義,但是如果有需要還是會(huì)減少activity活著fragment中的代碼量。
//presenter只負(fù)責(zé)調(diào)用。然后獲得數(shù)據(jù)而不管代碼的實(shí)現(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);
}
});
}
});
}
//對(duì)庫的信息進(jìn)行一層過濾
public Observable<List<Repos>> getReposInfo(String userName){
return githubApiService.getReposInfo(userName);
}
}
我將用戶的名字后面加了一個(gè)datamanager,在這里雖然沒什么意義,但是要體現(xiàn)datamanager的作用所在。
不足
沒有任何東西是完美的。
這里如果只有一個(gè)DataManager的話,那么如果數(shù)據(jù)量一大,這個(gè)類會(huì)變得非常的臃腫和復(fù)雜。
所有東西都是在不斷嘗試吧,貼出這個(gè)思想創(chuàng)始人的文章:Android Application Architecture
好了,去上課了。。近代史!