讓我的專案也使用RxJava+OkHttp+Retrofit
這讓我這個小菜鳥是萬萬沒有想到的,所以在這我要感謝所有給我鼓勵,給我建議的擼友們,謝謝你們,我會努力的!
之前專案用的是 OkHttp 的開源框架完成的網路請求,但是我們程式設計師要跟得上時代的潮流!
可以發現 RxJava 和 Retrofit 位居排行榜的第一第三,由此可見學習RxJava+Retrofit的必要性!
於是,我花了兩天的時間學習了一下 Retrofit 和 RxJava,發現RxJava 真TM強呀!相見恨晚哪!
因為花的時間不多,所以只瞭解到一些皮毛,然後趁熱打鐵,嘗試著在自己的專案中加入這個強大的框架,有些細節可能處理的不好,請多多指教!
先宣告:本篇文章只介紹如何簡單的使用 Retrofit+RxJava, 詳細部分就請大家自己查詢資料,因為本人知道也太少...
推薦覺得比較好的文章:
- 的
首先將需要新增的依賴全部新增,後面就不贅述了。
//Retrofit
compile 'com.squareup.retrofit2:retrofit:2.2.0'
//Retrofit透過GSON將結果轉換為Bean物件
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
//讓Retrofit支援RxJava
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//RxJava
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
//日誌攔截器
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
還是先來一波結果演示圖:
我就拿我的專案中模組來進行修改,資料還是來源 。
這裡我就把我的 Appkey
無私的貢獻出來
這是我的資料介面
相信大家都能看的懂吧,除了固定 url
,後面引數分別代表 開發者的 AppKey
、獲取資料的頁數和每頁顯示的條數。
這是我從伺服器獲取到的 json
資料:
{
"error_code": 0,
"reason": "Success",
"result": {"data": [{
"content": "一男子跟朋友走在路上,突然發現五個女人正在圍毆其丈母孃! 朋友見狀,忙問男子:u201c你還不趕緊上去幫忙?!u201d 男子鎮定地說:u201c不用,五個人足夠了!u201d",
"hashId": "0a8b6fdd70daa311aa82a771132d9895",
"unixtime": 1487980430,
"updatetime": "2017-02-25 07:53:50"
}]}
}
然後透過 Android Studio
外掛 GsonFormat
自動生成 javaBean
物件,這裡我就不把程式碼貼出來了,太多了。
public interface QNewsService {
public static final String DESC = "desc"; // 指定時間之前釋出的
public static final String ASC = "asc"; // 指定時間之後釋出的
/**
* 查詢最新的段子資料
*
* @param page 查詢的頁數
* @param pagesize 一頁資料顯示的條數
* @return 查詢結束返回的被觀察者
*/
//介面完整地址
//
@GET("text.from?key=ae240f7fba620fc370b803566654949e")
Observable getCurrentJokeData(
@Query("page") int page,
@Query("pagesize") int pagesize
);
/**
* 根據指定的時間,獲取相關的段子資料
*
* @param time 要指定查詢的時間
* @param page 查詢的頁數
* @param pagesize 一頁資料顯示的條數
* @param sort 判斷是在指定時間之前還是之後
* {@value DESC 指定之前},{@value ASC 指定之後}
* @return 查詢結束返回的被觀察者
*/
//介面完整地址
//
@GET("list.from?key=ae240f7fba620fc370b803566654949e")
Observable getAssignJokeData(
@Query("time") long time,
@Query("page") int page,
@Query("pagesize") int pagesize,
@Query("sort") String sort
);
}
@GET
: 請求方法為GET
("text.from?key=ae240f7fba620fc370b803566654949e")
:除去baseUrl
,因為AppKey
值固定,就可以直接寫進去,要查詢的單獨列出來
Observable
:這個就是RxJava+Retrofit
的簡單結合體,當你從伺服器獲取資料直接返回JavaBean物件,是不是很強大,然後把它有轉換成 被觀察者,方便後面事件的傳遞。
@Query("page") int page
:透過@Query
來設定查詢條件
public class QClitent {
private static QClitent mQClient;
private Retrofit mRetrofit;
private QClitent(){
mRetrofit = createRetrofit();
}
public static QClitent getInstance() {
if (mQClient == null){
synchronized (QClitent.class){
if (mQClient == null){
mQClient = new QClitent();
}
}
}
return mQClient;
}
/**
* 建立相應的服務介面
*/
public T create(Class service){
checkNotNull(service, "service is null");
return mRetrofit.create(service);
}
/**
* 直接建立 QNewsService
*/
public QNewsService createQNewsService(){
return mRetrofit.create(QNewsService.class);
}
private T checkNotNull(T object, String message) {
if (object == null) {
throw new NullPointerException(message);
}
return object;
}
private Retrofit createRetrofit() {
//初始化OkHttp
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(9, TimeUnit.SECONDS) //設定連線超時 9s
.readTimeout(10, TimeUnit.SECONDS); //設定讀取超時 10s
if (BuildConfig.DEBUG) { // 判斷是否為debug
// 如果為 debug 模式,則新增日誌攔截器
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(interceptor);
}
// 返回 Retrofit 物件
return new Retrofit.Builder()
.baseUrl(Constants.BASE_JOKE_URL)
.client(builder.build()) // 傳入請求客戶端
.addConverterFactory(GsonConverterFactory.create()) // 新增Gson轉換工廠
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 新增RxJava2呼叫適配工廠
.build();
}
}
這裡採用 單例模式 獲取
Retrofit
物件,建立相應的服務介面。註釋寫的比較詳細,我就不多說了。
private void updateDate() {
srlJoke.setRefreshing(true); // 讓SwipeRefreshLayout開啟重新整理
QClitent.getInstance()
.create(QNewsService.class) // 建立服務
.getCurrentJokeData(1, 8) // 查詢
.subscribeOn(Schedulers.io()) // 指定被觀察者的操作在io執行緒中完成
.observeOn(AndroidSchedulers.mainThread()) // 指定觀察者接收到資料,然後在Main執行緒中完成
.subscribe(new Consumer() {
@Override
public void accept(JokeBean jokeBean) throws Exception {
// 成功獲取資料
mAdapter.setNewData(jokeBean.getResult().getData()); // 給介面卡設定資料
srlJoke.setRefreshing(false); // 讓SwipeRefreshLayout關閉重新整理
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
// 獲取資料失敗
Toast.makeText(getActivity(), "獲取資料失敗", Toast.LENGTH_SHORT).show();
srlJoke.setRefreshing(false);
}
});
}
RxJava
在GitHub
主頁上的自我介紹是"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"
(一個在 Java VM 上使用可觀測的序列來組成非同步的、基於事件的程式的庫)。這就是 RxJava ,概括得非常精準。透過強大的鏈式呼叫,一目瞭然,簡單迅速的完成了網路的非同步請求和資料載入。這就是
RxJava+Retrofit
的強大之處!其實這只是一小部分,RxJava
的功能遠不止於此,強大的運算子基本上可以完成專案中所有事件傳遞的需要,推薦大家,一定好好研究一下這個強大的框架!
最後的結果就是這樣,跟之前沒什麼太大區別:
好了,到此,簡單的 RxJava+Retrofit
小應用就結束了,雖然目前還是沒有找到工作,但是絲毫不影響我繼續學習下去,我相信,肯定有一家公司願意收留我的!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2810736/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我是如何讓 Ruby 專案提升 10 倍速度的
- 老闆居然讓我在Java專案中“造假”Java
- SSH 埠轉發 - 你不讓我看,我也能看
- 如果讓我完善幾年前的一個專案,我會做哪些改進?
- 專案經理成長日記(11)——我也會笑的很燦然
- 艾偉也談專案管理,如何讓網民愛上你的網站專案管理網站
- 讓Vue也可以使用ReduxVueRedux
- 不會 Web 開發,也能讓資料“動”起來的開源專案!Web
- 中石油考生:PMP讓我更加理解專案經理角色
- 我使用jest測試專案中常見的問題
- 坑爹專案「spring-cloud-alibaba」,我們也來一個SpringCloud
- 我開發的開源專案,讓.NET7中的EFCore更輕鬆地使用強型別Id型別
- 為了讓初學者有專案可入門,我整理了這23個開源專案……
- 我做IT專案的專案經理的經歷(轉)
- 6個專案帶給我的專案經驗
- 讓你的Rails專案保持清潔AI
- 我的專案命名規範
- 我眼中的專案經理
- 【原】我的專案管理之路專案管理
- 也談“任何管理皆專案”及專案管理的執行工具(轉)專案管理
- 一行程式碼讓你的專案輕鬆使用Dapr行程
- 餘晟:讓自家系統癱瘓,這事我也幹過
- Promise 讓你的專案更有逼格Promise
- 一次專案組聚餐,讓我重新認識了很多人
- 怎麼說服領導,能讓我用DDD架構肝專案?架構
- 我練習專案眼中的 vueVue
- 我的第一個Laravel專案Laravel
- 我的專案開發系統
- 我的新專案又來咯!
- [譯] 讓我們來簡化 UserDefaults 的使用
- 我做過的最糟糕的專案
- [原創] 我的專案管理之路--2、認知專案管理專案管理
- [專案管理徵文]我的專案管理之路--david78專案管理
- 當專案經理讓我負責資料展示功能開發,我的內心為什麼是拒絕的?
- 讓專案管理更有效 (轉)專案管理
- 讓專案管理更有效(轉)專案管理
- 如果你也想寫個完整的 Vue 元件專案Vue元件
- 讓客戶參與他們的IT專案