啊,經(jīng)過一天的研究對(duì)Retrofit和Rxjava終于有了一定的了解,俗話說的好,好好記性不如爛筆頭,于是寫個(gè)筆記,順便劃個(gè)水。嘿嘿嘿。
1. Retrofit
Retrofit是一個(gè)網(wǎng)絡(luò)請(qǐng)求框架,為啥Retrofit能夠在那么多的請(qǐng)求框架中脫引而出呢,個(gè)人覺得就是Retrofit的擴(kuò)展性,集成Rxjava,Gson等,只是一句話的事情,就像chrome一樣,以前一直覺得chrome很不好用,但是自從翻了墻,插件一安,瞬間覺得chrom碉堡了,
學(xué)習(xí)Retrofit第一步,就是要學(xué)習(xí)Retrofit的語法(從代碼的角度來說,就是api),Retrofit由兩部分組成,
- 第一部分是Retrofit本身,創(chuàng)建一個(gè)Retrofit 語法如下:
Retrofit retrofit = new Retrofit.builder() .baseUrl(baseurl).build();
這是基本的Retrofit,如果想要擴(kuò)展的話,只需要添加需要擴(kuò)展的部分就可以了(比如擴(kuò)展Gson,okhttp設(shè)置,Rxjava等)。 - 第二部分是請(qǐng)求的Api,創(chuàng)建一個(gè)api語法如下,
public interface Api{ @Get("index/{id}/{target}") Call(Bean) getIndex(@path("id)String id , @path(target)String target); }
上面就是一個(gè)基本的api的創(chuàng)建,需要記得東西就是,Retroofit的注解,常用注解有,@get(聲明一個(gè)get請(qǐng)求的call)
@Post(聲明一個(gè)post的call)
@FormUrlEncoded(只有以表單方式提交的時(shí)候可以用這個(gè),)
@Path(填充url中的占位符)
@Query(填充url中的參數(shù) 比如 "/index?id=1&name=job" )
@File(填充post表單提交請(qǐng)求的單條內(nèi)容,對(duì)應(yīng)http header 里面appliacation/x-www.....)
@Body(相當(dāng)于一個(gè)File的集合,然后將全部要submit的數(shù)據(jù),放到一個(gè)bean里面,Retrofit會(huì)自動(dòng)拆分bean中的每一個(gè)K-V,然后一個(gè)個(gè)放到post請(qǐng)求的body里面,所以這里的bean不需要序列化,bean會(huì)被自動(dòng)轉(zhuǎn)換為json,對(duì)應(yīng)http請(qǐng)求header里面的appliacation/json,) - 當(dāng)Retrofit與Rxjava一起使用的時(shí)候, 需要改變的東西只有,api中的方法的返回值變?yōu)镺bservable<Bean>即可。
- 當(dāng)單獨(dú)使用Retrofit的時(shí)候,代碼如下;
Api api= retrofit.create(Api.class); api.execute();
上面是Retrofit的同步使用方法;異步使用方法如下
Api api = retrofit.create(Api.class); api .enqune(new Callback(){ @override void success(Response response){ } @override void error(){ } )
2. Rxjava
Rxjava相對(duì)于Retrofit,就比較有難度了,Rxjava源碼找個(gè)時(shí)間研究一哈,現(xiàn)在把自己知道的Rxjava基本用法寫下來。
開始之前,先背幾個(gè)單詞,
Subscribe
Subscriber
SubscribeOn
Observer
Observable
Observeon
FunX ----- OnSubscribe
ActionX ---- Subscriber
Subscriber接口與Observer接口的功能相似,并且多了幾個(gè)功能,所以盡量使用Subscriber,而對(duì)于ActionX來說,是對(duì)Subscriber的簡(jiǎn)單封裝。
Observable.OnsubScribe 是創(chuàng)建Obervabl時(shí),需要實(shí)現(xiàn)的接口,比如:
Observable observable = new Observable(new Observable.OnSubscribe<T>(){ @override public void call(Subscriber<? super T > Subscriber) { //Subscriber 就是觀察者,在這里執(zhí)行oNnext等 }) 這里有一個(gè)疑問,就是對(duì)于Rxjava的lift方法和這里的這個(gè)Call有什么關(guān)系。
當(dāng)Retrofit與Rxjava一起使用的時(shí)候,Observable的創(chuàng)建就不需要上面這種方式了,取而代之的是Retrofit的是由create( interface api)的返回值來創(chuàng)建Observable。
重點(diǎn):
- Rxjava處理數(shù)據(jù)的各種方法,簡(jiǎn)直了,
- Rxjava的線程切換 ,
其中 , SubscribeOn只有第一次是生效的,第二次使用SubsribeOn的時(shí)候,不會(huì)有效果,但是SubscribeOn在一個(gè)地方有奇效,那就是配合doOnSubscribe()的時(shí)候,講doOnSubscribe這個(gè)方法,就要講一下Subscriber的Onstart方法,著個(gè)方法是Subscriber的一個(gè)不需要強(qiáng)制實(shí)現(xiàn)的方法,onStart著個(gè)方法執(zhí)行的時(shí)間是subscribe之前,onstart執(zhí)行的線程一定是調(diào)用subscribe()著個(gè)方法所在的線程,不能設(shè)置,但是doOnSubscrib()這個(gè)方法可以設(shè)置運(yùn)行線程,并且doOnsubscribe()的執(zhí)行時(shí)間是在subscribe()執(zhí)行后事件發(fā)生之前,而subscribeOn()這個(gè)方法如果在doOnSubscribe之后的話,就可以指定doOnSubscribe()這個(gè)方法執(zhí)行的線程。
action 代表一個(gè)事件結(jié)束
fun 代表一個(gè)事件開始?
對(duì)于fun和action ,理解他們是接口就可以了,只不過有時(shí)候可以用他們來代替subscriber和onsubscribe,