前言
首先上篇文章講到的是依賴注入(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)在用這套方法在做別的項目了。
依賴注入圖
gtihubquery依賴注入圖1.png


可以看到我在ActivityComponent中的API是拋出了很多的inject方法用來注入其他所有的activity,但是這種做法適合小項目,項目大了之后,如果每個activity的依賴需求不同還是很麻煩,所以最好一個activity一個component。對照這個圖看代碼基本問題不大,我記得當(dāng)時對于@Inject這個注解的理解不是很深刻!
DataManager相當(dāng)于是model所有數(shù)據(jù)源的代理層,作為ApplicaitonComponent的API暴露出來,然后作為ActivityComponent的依賴注入進去。
@Inject()
如果@Inject標(biāo)注的是構(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)用這個方法.
//當(dāng)然我在這里做的操作毫無意義,但是如果有需要還是會減少activity活著fragment中的代碼量。
//presenter只負責(zé)調(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
好了,去上課了。。近代史!