前言
在去年最火的無(wú)疑是RxJava+Retrofit這對(duì)組合了倡缠,出去說(shuō)自己不會(huì)都不好意思,在去年的時(shí)候就看過(guò)RxJava和Retrofit全景,但是那時(shí)候看著這兩個(gè)玩意一臉懵比,特別是初次看到RxJava的時(shí)候覺(jué)得這個(gè)學(xué)著好困難,看了些文章跟著寫(xiě)了寫(xiě)(然并卵)丽蝎,隨便寫(xiě)個(gè)啥請(qǐng)求都要擼一大串代碼,感覺(jué)沒(méi)有傳說(shuō)的那么神奇膀藐,但是結(jié)合上Retrofit后簡(jiǎn)直不要太叼(鳥(niǎo)槍換炮)屠阻,如果對(duì)于這對(duì)組合沒(méi)什么了解的話沒(méi)關(guān)系,這里推薦兩篇非常不錯(cuò)的文章:
扔物線大神寫(xiě)的:《給 Android 開(kāi)發(fā)者的 RxJava 詳解》
個(gè)人比較喜歡的:www.reibang.com/u/c50b715ccaeb
看完這兩個(gè)基本上就對(duì)RxJava和Retrofit算是有個(gè)基本的了解额各,下面簡(jiǎn)單使用下RxJava和Retrofit
RxJava+Retrofit進(jìn)行網(wǎng)絡(luò)請(qǐng)求
1.添加依賴国觉。
注意:converter-gson,adapter-rxjava2需要與retrofit版本一樣
compile'io.reactivex.rxjava2:rxjava:2.1.0'
compile'io.reactivex.rxjava2:rxandroid:2.0.1'
compile'com.squareup.retrofit2:retrofit:2.2.0' //retrofit依賴
compile'com.squareup.retrofit2:converter-gson:2.2.0' //gson
compile'com.squareup.retrofit2:adapter-rxjava2:2.2.0' //讓retrofit能被rxjava使用
2.寫(xiě)一個(gè)API請(qǐng)求
public interface Api {
//查詢書(shū)本
@GET("v2/book/search")
Observable<Book> searchBook(@Query("q") String bookName);
}
這里返回的是一個(gè)Observable
類型,Book
就是這個(gè)Observable
的泛型也就是實(shí)體類虾啦,這樣就能被RxJava使用麻诀,作為被觀察者
3.創(chuàng)建一個(gè)Retrofit進(jìn)行請(qǐng)求
//初始化Okhttp
mOkHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.douban.com/")
.client(mOkHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //支持RxJava
.addConverterFactory(GsonConverterFactory.create()) //gson解析
.build();
Api api=retrofit.create(Book.class);
api.searchBook("西游記").subscribeOn(Schedulers.io()) //在io線程進(jìn)行請(qǐng)求
.observeOn(AndroidSchedulers.mainThread()) //在主線程操作返回結(jié)果
.unsubscribeOn(Schedulers.io())
.subscribe(new Observer<Book>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Book book) {
//請(qǐng)求成功
}
@Override
public void onError(@NonNull Throwable e) {
//請(qǐng)求失敗
}
@Override
public void onComplete() {
}
});
注:Book
類是使用GsonFormat插件生成
下面看下具體實(shí)現(xiàn)情況(注:這里取書(shū)籍的副標(biāo)題,可能為空):
到這里也算是跑了一遍RxJava和Retrofit的流程缸逃,是不是覺(jué)得有點(diǎn)意思针饥,結(jié)構(gòu)清晰明了,but細(xì)心的朋友會(huì)發(fā)現(xiàn)很多能優(yōu)化的地方需频,比如:
- 每次請(qǐng)求都寫(xiě)一串代碼創(chuàng)建Retrofit
- 每次訂閱
Observable
時(shí)都有一大串重寫(xiě)的方法丁眼,然而我們只關(guān)心請(qǐng)求成功與否和請(qǐng)求成功后返回的數(shù)據(jù) - 每次都需要設(shè)置
Obserable
和Observer
在哪個(gè)線程里工作 - 如果請(qǐng)求未完成但是界面卻退出了就會(huì)存在內(nèi)存泄漏的風(fēng)險(xiǎn)
- 每次請(qǐng)求添加公共參數(shù)(例如設(shè)備號(hào),版本信息等等)
MVP
這簡(jiǎn)單說(shuō)說(shuō)我對(duì)MVP的理解:
Model:對(duì)數(shù)據(jù)進(jìn)行操作(網(wǎng)絡(luò)請(qǐng)求昭殉,數(shù)據(jù)庫(kù)存儲(chǔ)苞七,取本地?cái)?shù)據(jù)等等)
View:對(duì)UI進(jìn)行操作
Presenter:處理邏輯代碼,并且負(fù)責(zé)View和Model交互
簡(jiǎn)單來(lái)說(shuō)就是M層得到數(shù)據(jù)后挪丢,交給P層去處理一些邏輯蹂风,然后由P層把處理過(guò)的數(shù)據(jù)給V層去顯示,這樣一來(lái)V層和M層就沒(méi)有關(guān)聯(lián)了乾蓬,也算是很大程度上解耦惠啄,也推薦下相關(guān)的MVP資料:
鴻洋大神的:http://blog.csdn.net/lmj623565791/article/details/46596109
google的:https://github.com/googlesamples/android-architecture/tree/todo-mvp/
這次就先簡(jiǎn)單使用下并且看清需要優(yōu)化地方,明天周末,祝大家周末愉快撵渡,下次就是對(duì)RxJava+Retrofit+MVP封裝融柬。