Retrofit、GsonFormat、RxJava、RxAndroid簡(jiǎn)單實(shí)踐

原文鏈接: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


postmain

好了,拿到服務(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í)行

開(kāi)源讓世界更美好

感謝

給 Android 開(kāi)發(fā)者的 RxJava 詳解

Rxlifecycle使用詳解,解決RxJava內(nèi)存泄露問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容