原文鏈接:http://iaskwind.com/2016/06/15/reftofit-gsonformat-rxjava-rxandroid/
最近看了簡(jiǎn)書(shū)上很多說(shuō)retrofit與rxjava的文章,所以今天我也來(lái)講下我是如何用這些最新的東西的。廢話不多說(shuō),直接上代碼
引入依賴
開(kāi)發(fā)工具肯定是androidstudio,這點(diǎn)以后都不用說(shuō)了吧,因?yàn)楝F(xiàn)在github上很多東西都是支持androidstudio,目前使用感覺(jué)很方便,簡(jiǎn)單一行,就能把所有的功能引入進(jìn)來(lái)。接下來(lái)我會(huì)用到rxjava rxandroid retrofit rxlifecycle 具體的這些事什么請(qǐng)自行去查閱,最后的時(shí)候,我會(huì)放在相關(guān)具體介紹的鏈接
說(shuō)明
下面一些*version是我在gradle中定義的變量,防止我每次都要改多次的問(wèn)題
ext {
butterknifeVersion = '8.0.1'
supportVersion = '23.2.1'
retrofit2Version = '2.0.2'
rxlifecycleVersion = '0.5.0'
}
下面的拷貝項(xiàng)目的build.gradle 而不是工程的里面(又啰嗦了)
compile 'io.reactivex:rxjava:1.1.3'
compile 'io.reactivex:rxandroid:1.1.0'
compile "com.squareup.retrofit2:retrofit:${retrofit2Version}"
compile "com.squareup.retrofit2:converter-gson:${retrofit2Version}"
compile "com.squareup.retrofit2:adapter-rxjava:${retrofit2Version}"
compile "com.trello:rxlifecycle:${rxlifecycleVersion}"
compile "com.trello:rxlifecycle-components:${rxlifecycleVersion}"
rxlifecycle說(shuō)明
此處使用rxlifecycle來(lái)處理一些訂閱的回收
https://github.com/trello/RxLifecycle就使被用來(lái)嚴(yán)格控制由于發(fā)布了一個(gè)訂閱后,由于沒(méi)有及時(shí)取消,導(dǎo)致Activity/Fragment無(wú)法銷毀導(dǎo)致的內(nèi)存泄露。
既然我們要使用rxlifecycle就要按照它的規(guī)則來(lái),我把目前的我的BaseActivity 繼承 RxAppCompatActivity。具體使用的時(shí)候,我再說(shuō)
GsonFormat使用
假如服務(wù)端給我個(gè)接口,該接口返回json數(shù)據(jù)。
接口地址:http://ip:端口/customer/getAppCutomerList
請(qǐng)求方式:GET
請(qǐng)求參數(shù)(header):
參數(shù)名 類型 必填 參數(shù)位置 描述
accessToken string 是 header token
-------------------------------------------
請(qǐng)求參數(shù)(urlParam):
參數(shù)名 類型 必填 參數(shù)位置 描述
login_name string 是 urlParam 登錄名
pageNumber int 是 urlParam 頁(yè)數(shù)
name string 是 urlParam 查詢參數(shù)
找個(gè)網(wǎng)絡(luò)請(qǐng)求工具,我用的是Postmain谷歌瀏覽器的插件,填上對(duì)應(yīng)的數(shù)據(jù),按下send就能拿到對(duì)應(yīng)的json

好了,拿到服務(wù)端返回json可以創(chuàng)建實(shí)體了
先隨便創(chuàng)建個(gè)實(shí)體,我這里創(chuàng)建CustomerReturnBean,直接在實(shí)體名稱上,點(diǎn)擊右鍵generate...選擇GsonFormat(前提:你已經(jīng)裝了這個(gè)插件)填入上面返回的json,看看對(duì)應(yīng)的屬性類型是否是你想要的,沒(méi)有問(wèn)題,點(diǎn)擊ok,生成對(duì)應(yīng)的實(shí)體。
Retrofit實(shí)例創(chuàng)建
類:AccountsService
public class AccountsService {
private static Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
.baseUrl(UrlContant.getBaseUrl())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
public static AccountsApi createAccountsService() {
return retrofitBuilder.build().create(AccountsApi.class);
}
}
對(duì)應(yīng)的一些請(qǐng)求方法接口:
public interface AccountsApi {
/**
* 客戶搜索查詢接口
*
* @param loginName
* @param pageNumber
* @param name 查詢關(guān)鍵字
* @return
*/
@GET(UrlContant.searchCustomer)
Observable<CustomerReturnBean> searchCustomer(@Query("login_name") String loginName, @Query("pageNumber") int pageNumber, @Query("name") String name,@Header("accessToken") String accessToken);
}
因?yàn)槲疫@里很方法都需要login_name accessToken,這個(gè)是登錄的時(shí)候,獲取到保存在本地的。我這里設(shè)置個(gè)輔助類:
類:AccountsApiHelper
public class AccountsApiHelper {
private static AccountsApiHelper instance;
private static AccountsApi service;
private String userName;
private String accessToken;
public static synchronized AccountsApiHelper getInstance() {
if (instance == null) {
instance = new AccountsApiHelper();
}
//初始化一些參數(shù)
instance.init();
return instance;
}
private void init() {
if (service == null) {
service = AccountsService.createAccountsService();
}
}
private void getValue() {
userName = AppContext.getInstance().getLoginName();
accessToken = AppContext.getInstance().getAccessToken();
}
/**
* 客戶搜索查詢接口
* @param pageNumber
* @param searchValue
* @return
*/
public Observable<CustomerReturnBean> searchCustomer(int pageNumber,String searchValue){
getValue();
return service.searchCustomer(userName,pageNumber,searchValue,accessToken);
}
}
這里實(shí)例構(gòu)建完成了
Retrofit+RxJava請(qǐng)求數(shù)據(jù)
private void loadData(int pageNumber,final boolean isRefresh,String searchValue) {
//上面創(chuàng)建的接口
AccountsApiHelper.getInstance().searchCustomer(pageNumber,searchValue)
.subscribeOn(Schedulers.io())
.compose(this.<CustomerReturnBean>bindToLifecycle()) //這里用到rxlifecycle
.doOnSubscribe(new Action0() { //處理一開(kāi)始需要的進(jìn)度條加載,一開(kāi)始需要的ui里面執(zhí)行的
@Override
public void call() {
if (!customerWsrefresh.isRefreshing()) {
ViewUtils.setViewVisibility(commonLoading, true);
newton_cradle_loading.start();
}
}
})
.subscribeOn(AndroidSchedulers.mainThread()) //這里的subscribeOn為上面的doOnSubscribe設(shè)定執(zhí)行線程
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(new Action0() { //結(jié)束執(zhí)行 關(guān)閉進(jìn)度加載
@Override
public void call() {
ViewUtils.setViewVisibility(commonLoading, false);
newton_cradle_loading.stop();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<CustomerReturnBean>() {
@Override
public void call(CustomerReturnBean customerReturnBean) {
//成功執(zhí)行
handlerSuccess(customerReturnBean, isRefresh);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
handlerFailure(isRefresh);
}
});
}
這里拿到數(shù)據(jù),具體后面該怎么展示,各位看官隨意。
各位感覺(jué)上面有什么錯(cuò)誤和建議,歡迎提問(wèn)謝謝
補(bǔ)充:
有時(shí)候,我們需要延遲執(zhí)行和放重復(fù)點(diǎn)擊可以用如下:
.throttleFirst(10,TimeUnit.SECONDS)//重復(fù)點(diǎn)擊處理
.delay(manualCheck?0:3, TimeUnit.SECONDS)//延遲執(zhí)行