如何用RxJava2.0.7和Retrofit2.2.0優(yōu)雅的實現(xiàn)網(wǎng)絡請求

本文源碼地址:https://github.com/HelloNanKe/Joke
先看一下Rxjava和Retrofit相關的依賴

compile'io.reactivex.rxjava2:rxjava:2.0.7'
compile'io.reactivex.rxjava2:rxandroid:2.0.1'
compile'com.squareup.retrofit2:retrofit:2.2.0'
compile'com.squareup.retrofit2:converter-gson:2.2.0'
compile'com.squareup.retrofit2:adapter-rxjava2:2.2.0'

本文以來福島的一個笑話api為例,在這里想他們表示感謝
api為:http://api.laifudao.com/open/xiaohua.json
返回的數(shù)據(jù),沒有數(shù)據(jù)頭抽减,且返回的內(nèi)容中夾雜著HTML標簽

先看代碼吧:

public interfaceApiService {
/**
* 來福笑話接口
*@return List<>
*/
@GET("xiaohua.json")
Observable<List<MyJoke>> getData();
}

在這里需要注意的是允青,與Retrofit相比不再是Call<List<MyJoke>>,而是使用了Rxjava的Observable<List<MyJoke>> getData();

這里MyJoke使用GsonFormat自動生成的一個實體類。

接下來就是對網(wǎng)絡請求進行一下簡單的封裝了
HttpMethods.java文件

package com.example.nanke.joke;


import com.example.nanke.joke.JavaBean.MyJoke;

import java.util.List;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import okhttp3.OkHttpClient;

import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
 * Created by zt on 2017/3/10.
 */

public class HttpMethods {

    private static final String BASE_URL = "http://api.laifudao.com/open/";
    private static final int TIME_OUT=4;
    private Retrofit retrofit;
    private ApiService apiService;

    private HttpMethods() {
        /**
         * 構造函數(shù)私有化
         * 并在構造函數(shù)中進行retrofit的初始化
         */
        OkHttpClient client=new OkHttpClient();
        client.newBuilder().connectTimeout(TIME_OUT, TimeUnit.SECONDS);
        /**
         * 由于retrofit底層的實現(xiàn)是通過okhttp實現(xiàn)的卵沉,所以可以通過okHttp來設置一些連接參數(shù)
         * 如超時等
         */
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        apiService=retrofit.create(ApiService.class);
    }


    private static class sinalInstance {
        public static final HttpMethods instance = new HttpMethods();
    }

    public  static HttpMethods getInstance(){
        return sinalInstance.instance;
    }

    public void getJoke(Observer<List<MyJoke>> observer){

        apiService.getData()
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }
}

在HttpMethods中颠锉,將構造函數(shù)私有化是為了實現(xiàn)單例,并向外提供了一個請求數(shù)據(jù)的方法 getJoke;該方法的參數(shù)是一個觀察者史汗,接著看一下MainActivity.java文件

package com.example.nanke.joke;


import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import com.cjj.MaterialRefreshLayout;
import com.cjj.MaterialRefreshListener;
import com.example.nanke.joke.JavaBean.MyJoke;

import java.util.ArrayList;
import java.util.List;


import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;


public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private List<MyJoke> jokes = new ArrayList<>();

    private MyAdpter adpter;
    private MaterialRefreshLayout materialRefreshLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recycler_View);
        materialRefreshLayout = (MaterialRefreshLayout) findViewById(R.id.refresh);
        getData();


        materialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
            @Override
            public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        getData();
                        adpter.refreshData(jokes);
                        materialRefreshLayout.finishRefresh();
                    }
                }, 2000);
            }
        });
    }

    public void getData() {


        HttpMethods.getInstance().getJoke(new Observer<List<MyJoke>>() {
            Disposable d;

            @Override
            public void onSubscribe(Disposable d) {
                this.d = d;
            }

            @Override
            public void onNext(List<MyJoke> myJokes) {
                jokes = myJokes;
                adpter = new MyAdpter(myJokes);
                LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(adpter);
                adpter.notifyDataSetChanged();
                Log.d("MAIN", "獲取數(shù)據(jù)完成" + myJokes.size());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("MAIN", "error" + e.toString());
                d.dispose();
            }

            @Override
            public void onComplete() {
                Log.d("MAIN", "onComplete");
                d.dispose();
            }
        });

    }
}

重點請看下面這個方法(請忽略那蹩腳的下拉刷新)

public void getData() {


        HttpMethods.getInstance().getJoke(new Observer<List<MyJoke>>() {
            Disposable d;

            @Override
            public void onSubscribe(Disposable d) {
                this.d = d;
            }

            @Override
            public void onNext(List<MyJoke> myJokes) {
                jokes = myJokes;
                adpter = new MyAdpter(myJokes);
                LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(adpter);
                adpter.notifyDataSetChanged();
                Log.d("MAIN", "獲取數(shù)據(jù)完成" + myJokes.size());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("MAIN", "error" + e.toString());
                d.dispose();
            }

            @Override
            public void onComplete() {
                Log.d("MAIN", "onComplete");
                d.dispose();
            }
        });

    }

該方法是運行在主線程中的,所以再也不需要Handler什么的了琼掠,非常方便。
最后再看一下布局文件和效果圖吧

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.nanke.joke.MainActivity">
    <com.cjj.MaterialRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_View"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v7.widget.RecyclerView>

    </com.cjj.MaterialRefreshLayout>

</RelativeLayout>

效果圖

screenG.gif

源碼地址:https://github.com/HelloNanKe/Joke
咦停撞,還差一點,包含HTML標簽的文本處理

 Spanned sp = Html.fromHtml( joke.getContent() );
        holder.content.setText(sp);
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓷蛙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子戈毒,更是在濱河造成了極大的恐慌速挑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件副硅,死亡現(xiàn)場離奇詭異姥宝,居然都是意外死亡,警方通過查閱死者的電腦和手機恐疲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門腊满,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人培己,你說我怎么就攤上這事碳蛋。” “怎么了省咨?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵肃弟,是天一觀的道長。 經(jīng)常有香客問我零蓉,道長笤受,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任敌蜂,我火速辦了婚禮箩兽,結果婚禮上,老公的妹妹穿的比我還像新娘章喉。我一直安慰自己汗贫,他們只是感情好身坐,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著落包,像睡著了一般部蛇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咐蝇,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天搪花,我揣著相機與錄音,去河邊找鬼嘹害。 笑死撮竿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笔呀。 我是一名探鬼主播幢踏,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼许师!你這毒婦竟也來了房蝉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤微渠,失蹤者是張志新(化名)和其女友劉穎搭幻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逞盆,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡檀蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了云芦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俯逾。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舅逸,靈堂內(nèi)的尸體忽然破棺而出桌肴,到底是詐尸還是另有隱情,我是刑警寧澤琉历,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布坠七,位于F島的核電站,受9級特大地震影響旗笔,放射性物質發(fā)生泄漏彪置。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一换团、第九天 我趴在偏房一處隱蔽的房頂上張望悉稠。 院中可真熱鬧宫蛆,春花似錦艘包、人聲如沸的猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卦尊。三九已至,卻和暖如春舌厨,著一層夾襖步出監(jiān)牢的瞬間岂却,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工裙椭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躏哩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓揉燃,卻偏偏與公主長得像扫尺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炊汤,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評論 25 707
  • 雖然愛情憑的是直覺和熱烈正驻,卻也不能沒有理智與冷靜,這是我的觀點抢腐。 所以不要相信一見鐘情姑曙,也不要輕易相信時間過長的日...
    三白是什么可以吃嗎閱讀 743評論 2 2
  • p1: 迎國慶 慶中秋 青春合唱團 堅持與夢想者同行 用青春,揮灑愛心 beiko事業(yè)部 p2 從一個人到一群人 ...
    格桑月閱讀 3,003評論 0 0
  • 我們經(jīng)常需要判斷某一段語句執(zhí)行需要多少時間迈倍,過去常用的做法是記錄運行前的時間伤靠,然后用運行完成的時間減去運行前的時間...
    熊熊要更努力閱讀 875評論 0 1