日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践

發(fā)布時間:2025/3/8 java 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

RxJava和Retrofit也火了一段時間了,不過最近一直在學(xué)習(xí)ReactNative和Node相關(guān)的姿勢,一直沒有時間研究這些新東西,最近有個項目準備寫,打算先用Android寫一個Demo出來,卻發(fā)現(xiàn)Android的世界發(fā)生了天翻地覆的變化,EventBus和OKHttp啥的都不見了,RxJava和Retrofit是什么鬼?

好吧,到Github上耐著性子看過了RxJava和Retrofit的介紹和幾個Demo,原來Android的大神Jake Wharton為Retrofit這個項目貢獻了這么多的代碼,沒有道理不用了。

如果你對RxJava不熟悉請先看給 Android 開發(fā)者的 RxJava 詳解這篇文章。

如果你對Retrofit不熟悉就先看Retrofit官網(wǎng)。

當(dāng)然也有很多RxJava與Retrofit的文章,但是我覺得很多大家都很糾結(jié)的功能都沒有被總結(jié)出來,所以才有了此篇文章。

歡迎大家拍磚。

接下來進入正文,我是從下面幾個角度去思考RxJava與Retrofit結(jié)合的。

  • RxJava如何與Retrofit結(jié)合
  • 相同格式的Http請求數(shù)據(jù)該如何封裝
  • 相同格式的Http請求數(shù)據(jù)統(tǒng)一進行預(yù)處理
  • 如何取消一個Http請求 -- 觀察者之間的對決,Oberver VS Subscriber
  • 一個需要ProgressDialog的Subscriber該有的樣子
  • 1.RxJava如何與Retrofit結(jié)合

    1.1 基本頁面

    先扔出build.gradle文件的內(nèi)容

    dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' compile 'com.google.code.gson:gson:2.6.2' compile 'com.jakewharton:butterknife:7.0.1'}

    也就是說本文是基于RxJava1.1.0和Retrofit 2.0.0-beta4來進行的。添加rxandroid是因為rxjava中的線程問題。

    下面先搭建一個基本的頁面,頁面很簡單,先來看文件目錄結(jié)構(gòu)

    activity_main.xml的代碼如下:

    <?xml version="1.0" encoding="utf-8"?>

    MainActivity.java的代碼如下:

    package com.queen.rxjavaretrofitdemo.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.Button;import android.widget.TextView;import com.queen.rxjavaretrofitdemo.R;import butterknife.Bind;import butterknife.ButterKnife;import butterknife.OnClick;public class MainActivity extends AppCompatActivity { @Bind(R.id.click_me_BN) Button clickMeBN; @Bind(R.id.result_TV) TextView resultTV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick(R.id.click_me_BN) public void onClick() { getMovie(); } //進行網(wǎng)絡(luò)請求 private void getMovie() { }}

    注意不要忘記加網(wǎng)絡(luò)權(quán)限

    1.2 只用Retrofit

    我們準備在getMovie方法中進行網(wǎng)絡(luò)請求,我們先來看看只使用Retrofit是如何進行的。

    我們使用豆瓣電影的Top250做測試連接,目標(biāo)地址為

    https://api.douban.com/v2/movie/top250?start=0&count=10

    至于返回的數(shù)據(jù)格式,大家自己訪問下鏈接就看到了,太長就不放進來了。

    首先我們要根據(jù)返回的結(jié)果封裝一個Entity,暫命名為MovieEntity,代碼就不貼了。

    接下來我們要創(chuàng)建一個接口取名為MovieService,代碼如下:

    public interface MovieService { @GET("top250") Call getTopMovie(@Query("start") int start, @Query("count") int count);}

    回到MainActivity之中,我們來寫getMovie方法的代碼

    //進行網(wǎng)絡(luò)請求private void getMovie(){ String baseUrl = "https://api.douban.com/v2/movie/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .build(); MovieService movieService = retrofit.create(MovieService.class); Call call = movieService.getTopMovie(0, 10); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { resultTV.setText(response.body().toString()); } @Override public void onFailure(Call call, Throwable t) { resultTV.setText(t.getMessage()); } });}

    以上為沒有經(jīng)過封裝的、原生態(tài)的Retrofit寫網(wǎng)絡(luò)請求的代碼。我們可以封裝創(chuàng)建Retrofit和service部分的代碼,然后Activity用創(chuàng)建一個Callback作為參數(shù)給Call,這樣Activity中只關(guān)注請求的結(jié)果,而且Call有cancel方法可以取消一個請求,好像沒Rxjava什么事了,我覺得可以寫到這就下班了~

    接下來我們要面對的問題是這樣的如果我的Http返回數(shù)據(jù)是一個統(tǒng)一的格式,例如

    { "resultCode": 0, "resultMessage": "成功", "data": {}}

    我們?nèi)绾螌Ψ祷亟Y(jié)果進行一個統(tǒng)一的處理呢?

    另外,我的ProgressDialog的show方法應(yīng)該在哪調(diào)用呢?看樣子只能在getMovie()這個方法里面調(diào)用了,換個地方發(fā)出請求就要在對應(yīng)的Listener里面寫一遍show()的代碼,其實挺鬧心。

    而且錯誤請求我也想集中處理掉不要貼重復(fù)的代碼。

    我們先來看結(jié)合了Rxjava之后,事情有沒有變化的可能。當(dāng)然即便是不用Rxjava,依舊能夠做很多的封裝,只是比較麻煩。

    如需查看項目代碼 --> 代碼地址:

    https://github.com/tough1985/RxjavaRetrofitDemo

    選擇Tag -> step1

    1.3 添加Rxjava

    Retrofit本身對Rxjava提供了支持。

    添加Retrofit對Rxjava的支持需要在Gradle文件中添加

    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'

    當(dāng)然我們已經(jīng)添加過了。

    然后在創(chuàng)建Retrofit的過程中添加如下代碼:

    Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build();

    這樣一來我們定義的service返回值就不在是一個Call了,而是一個Observable

    重新定義MovieService

    public interface MovieService { @GET("top250") Observable getTopMovie(@Query("start") int start, @Query("count") int count);}

    getMovie方法改為:

    //進行網(wǎng)絡(luò)請求private void getMovie(){ String baseUrl = "https://api.douban.com/v2/movie/"; Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); MovieService movieService = retrofit.create(MovieService.class); movieService.getTopMovie(0, 10) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { @Override public void onCompleted() { Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { resultTV.setText(e.getMessage()); } @Override public void onNext(MovieEntity movieEntity) { resultTV.setText(movieEntity.toString()); }});}

    這樣基本上就完成了Retrofit和Rxjava的結(jié)合,但是我知道你們當(dāng)然不會滿意的。

    接下來我們把創(chuàng)建Retrofit的過程封裝一下,然后希望Activity創(chuàng)建Subscriber對象傳進來。

    如需查看項目代碼 --> 代碼地址:

    https://github.com/tough1985/RxjavaRetrofitDemo

    選擇Tag -> step2

    1.4 將請求過程進行封裝

    創(chuàng)建一個對象HttpMethods

    public class HttpMethods { public static final String BASE_URL = "https://api.douban.com/v2/movie/";private static final int DEFAULT_TIMEOUT = 5;private Retrofit retrofit;private MovieService movieService;//構(gòu)造方法私有private HttpMethods() { //手動創(chuàng)建一個OkHttpClient并設(shè)置超時時間 OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); retrofit = new Retrofit.Builder() .client(httpClientBuilder.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(BASE_URL).build(); movieService = retrofit.create(MovieService.class);}//在訪問HttpMethods時創(chuàng)建單例private static class SingletonHolder{ private static final HttpMethods INSTANCE = new HttpMethods();}//獲取單例public static HttpMethods getInstance(){ return SingletonHolder.INSTANCE;}/*** 用于獲取豆瓣電影Top250的數(shù)據(jù)* @param subscriber 由調(diào)用者傳過來的觀察者對象* @param start 起始位置* @param count 獲取長度*/public void getTopMovie(Subscriber subscriber, int start, int count){ movieService.getTopMovie(start, count) .subscribeOn(Schedulers.io().unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);}}

    用一個單例來封裝該對象,在構(gòu)造方法中創(chuàng)建Retrofit和對應(yīng)的Service。如果需要訪問不同的基地址,那么你可能需要創(chuàng)建多個Retrofit對象,或者干脆根據(jù)不同的基地址封裝不同的HttpMethod類。

    我們回頭再來看MainActivity中的getMovie方法:

    private void getMovie(){ subscriber = new Subscriber() { @Override public void onCompleted() { Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { resultTV.setText(e.getMessage()); } @Override public void onNext(MovieEntity movieEntity) { resultTV.setText(movieEntity.toString()); } }; HttpMethods.getInstance().getTopMovie(subscriber, 0, 10);}

    其中subscriber是MainActivity的成員變量。

    如需查看項目代碼 --> 代碼地址:

    https://github.com/tough1985/RxjavaRetrofitDemo

    選擇Tag -> step3

    2.相同格式的Http請求數(shù)據(jù)該如何封裝

    第二部分和第三部分我參考了知乎上的一個問答:RxJava+Retrofit,在聯(lián)網(wǎng)返回后如何先進行統(tǒng)一的判斷?不過沒有完整的示例,所以在這寫一個完整的示例出來。

    這個段落我們來聊一下有些Http服務(wù)返回一個固定格式的數(shù)據(jù)的問題。例如:

    { "resultCode": 0, "resultMessage": "成功", "data": {}}

    大部分的Http服務(wù)可能都是這樣設(shè)置,resultCode和resultMessage的內(nèi)容相對比較穩(wěn)定,而data的內(nèi)容變化多端,72變都不一定夠變的,有可能是個User對象,也有可能是個訂單對象,還有可能是個訂單列表。按照我們之前的用法,使用Gson轉(zhuǎn)型需要我們在創(chuàng)建subscriber對象是指定返回值類型,如果我們對不同的返回值進行封裝的話,那可能就要有上百個Entity了,看著明明是很清晰的結(jié)構(gòu),卻因為data的不確定性無奈了起來。

    少年,不必?zé)?#xff0c;來來來~ 老衲賜你寶典葵花,老衲就是練了這個才出家。。。

    我們可以創(chuàng)建一個HttpResult類

    public class HttpResult { private int resultCode; private String resultMessage; private T data;}

    如果data是一個User對象的話。那么在定義Service方法的返回值就可以寫為

    Observable>

    這樣一來HttpResult就相當(dāng)于一個包裝類,將結(jié)果包裝了起來,但是在使用的時候要給出一個明確的類型。

    在上面的示例中,我也創(chuàng)建了一個HttpResult類,用來模仿這個形式,將其中的Subject單獨封裝了起來。

    public class HttpResult { //用來模仿resultCode和resultMessage private int count; private int start; private int total; private String title; //用來模仿Data private T subjects;}

    這樣泛型的時候就要寫為:

    Observable>>

    如需查看項目代碼 --> 代碼地址:

    https://github.com/tough1985/RxjavaRetrofitDemo

    選擇Tag -> step4

    3.相同格式的Http請求數(shù)據(jù)統(tǒng)一進行預(yù)處理

    既然我們有了相同的返回格式,那么我們可能就需要在獲得數(shù)據(jù)之后進行一個統(tǒng)一的預(yù)處理。

    當(dāng)接收到了一個Http請求結(jié)果之后,由于返回的結(jié)構(gòu)統(tǒng)一為

    { "resultCode": 0, "resultMessage": "成功", "data": {}}

    我們想要對resultCoderesultMessage先做一個判斷,因為如果resultCode == 0代表success,那么resultCode != 0時data一般都是null

    Activity或Fragment對resultCoderesultMessage基本沒有興趣,他們只對請求狀態(tài)data數(shù)據(jù)感興趣。

    基于這種考慮,我們在resultCode != 0的時候,拋出個自定義的ApiException。這樣就會進入到subscriber的onError中,我們可以在onError中處理錯誤信息。

    另外,請求成功時,需要將data數(shù)據(jù)轉(zhuǎn)換為目標(biāo)數(shù)據(jù)類型傳遞給subscriber,因為,Activity和Fragment只想拿到和他們真正相關(guān)的數(shù)據(jù)。

    使用Observable的map方法可以完成這一功能。

    HttpMethods中創(chuàng)建一個內(nèi)部類HttpResultFunc,代碼如下:

    /*** 用來統(tǒng)一處理Http的resultCode,并將HttpResult的Data部分剝離出來返回給subscriber** @param Subscriber真正需要的數(shù)據(jù)類型,也就是Data部分的數(shù)據(jù)類型*/private class HttpResultFunc implements Func1, T>{ @Override public T call(HttpResult httpResult) { if (httpResult.getResultCode() != 0) { throw new ApiException(httpResult.getResultCode()); } return httpResult.getData(); }}

    然后我們的getTopMovie方法改為:

    public void getTopMovie(Subscriber> subscriber, int start, int count){ movieService.getTopMovie(start, count) .map(new HttpResultFunc>()) .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber);}

    由于HttpResult中的泛型T就是我們希望傳遞給subscriber的數(shù)據(jù)類型,而數(shù)據(jù)可以通過httpResult的getData方法獲得,這樣我們就處理了泛型問題,錯誤處理問題,還有將請求數(shù)據(jù)部分剝離出來給subscriber

    這樣我們只需要關(guān)注Data數(shù)據(jù)的類型,而不必在關(guān)心整個過程了。

    需要注意一點,就是在定義Service的時候,泛型是

    HttpResult//orHttpResult>

    而在定義Subscriber的時候泛型是javaUser//orList

    不然你會得到一個轉(zhuǎn)型錯誤。

    如需查看項目代碼 --> 代碼地址:

    https://github.com/tough1985/RxjavaRetrofitDemo

    選擇Tag -> step5

    代碼中我是用豆瓣數(shù)據(jù)模擬了HttpResult中的resultCode和resultMessage,與文檔中的代碼略有出入。

    4.如何取消一個Http請求 -- 觀察者之間的對決,Observer VS Subscriber

    4.1 取消一個Http請求

    這一部分我們來聊一下關(guān)于取消Http請求的事情,已經(jīng)Oberver和Subscriber這兩個體位我們哪個更容易給我們G點。

    如果沒有使用Rxjava,那么Service返回的是一個Call,而這個Call對象有一個cancel方法可以用來取消Http請求。那么用了Rxjava之后,如何來取消一個請求呢?因為返回值是一個Observable。我們能做的似乎只有解除對Observable對象的訂閱,其他的什么也做不了。

    好在Retrofit已經(jīng)幫我們考慮到了這一點。答案在RxJavaCallAdapterFactory這個類的源碼中可以找到

    static final class CallOnSubscribe implements Observable.OnSubscribe> { private final Call originalCall; CallOnSubscribe(Call originalCall) { this.originalCall = originalCall; }@Override public void call(final Subscriber super Response> subscriber) { // Since Call is a one-shot type, clone it for each new subscriber. final Call call = originalCall.clone(); // Attempt to cancel the call if it is still in-flight on unsubscription.subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { call.cancel(); }})); try { Response response = call.execute(); if (!subscriber.isUnsubscribed()) { subscriber.onNext(response); } } catch (Throwable t) { Exceptions.throwIfFatal(t); if (!subscriber.isUnsubscribed()) { subscriber.onError(t); } return; } if (!subscriber.isUnsubscribed()) { subscriber.onCompleted(); }}}

    我們看到call方法中,給subscriber添加了一個Subscription對象,Subscription對象很簡單,主要就是取消訂閱用的,如果你查看Subscriptions.create的源碼,發(fā)現(xiàn)是這樣的

    public static Subscription create(final Action0 unsubscribe) { return BooleanSubscription.create(unsubscribe);}

    利用了一個BooleanSubscription類來創(chuàng)建一個Subscription,如果你點進去看BooleanSubscription.create方法一切就清晰了,當(dāng)接觸綁定的時候,subscriber會調(diào)用Subscription的unsubscribe方法,然后觸發(fā)創(chuàng)建Subscription時候的傳遞進來的Action0的call方法。RxJavaCallAdapterFactory幫我們給subscriber添加的是call.cancel(),

    總結(jié)起來就是說,我們在Activity或者Fragment中創(chuàng)建subscriber對象,想要取消請求的時候調(diào)用subscriber的unsubscribe方法就可以了。

    對不起這一節(jié)有太多的SubscriberSubscription以及ObserverObservable,老衲當(dāng)時看的時候也是不知道吐了多少次了,習(xí)慣了就好了。

    4.2 為什么會提到Oberver

    提到Observer的過程是這樣的。由于Subscriber一旦調(diào)用了unsubscribe方法之后,就沒有用了。且當(dāng)事件傳遞到onError或者onCompleted之后,也會自動的解綁。這樣出現(xiàn)的一個問題就是每次發(fā)送請求都要創(chuàng)建新的Subscriber對象。

    這樣我們就把注意力放到了Observer,Observer本身是一個接口,他的特性是不管你怎么用,都不會解綁,為什么呢?因為他沒有解綁的方法。所以就達到了復(fù)用的效果,一開始我一直美滋滋的用Observer。事實上,如果你用的是Observer,在調(diào)用Observable對象的subscribe方法的時候,會自動的將Observer對象轉(zhuǎn)換成Subscriber對象。

    下面是源碼:

    public final Subscription subscribe(final Observer super T> observer) { if (observer instanceof Subscriber) { return subscribe((Subscriber super T>)observer); } return subscribe(new Subscriber(){ @Overridepublic void onCompleted() {observer.onCompleted();}@Overridepublic void onError(Throwable e) {observer.onError(e);}@Overridepublic void onNext(T t) {observer.onNext(t);}});}

    后來發(fā)現(xiàn)了問題,

    問題1 無法取消,因為Observer沒有unsubscribe方法問題2 沒有onStart方法 這個一會聊

    這兩個問題是很痛苦的。所以,為了后面更好的高潮,我們還是選擇用Subscriber。

    5.一個需要ProgressDialog的Subscriber該有的樣子

    我們希望有一個Subscriber在我們每次發(fā)送請求的時候能夠彈出一個ProgressDialog,然后在請求接受的時候讓這個ProgressDialog消失,同時在我們?nèi)∠@個ProgressDialog的同時能夠取消當(dāng)前的請求,而我們只需要處理里面的數(shù)據(jù)就可以了。

    我們先來創(chuàng)建一個類,就叫ProgressSubscriber,讓他繼承Subscriber

    Subscriber給我們提供了onStart、onNext、onError、onCompleted四個方法。

    其中只有onNext方法返回了數(shù)據(jù),那我們自然希望能夠在onNext里面處理數(shù)據(jù)相關(guān)的邏輯。

    onStart方法我們用來啟動一個ProgressDialog。onError方法我們集中處理錯誤,同時也停止ProgressDialogonComplated方法里面停止ProgressDialog

    其中我們需要解決兩個問題

    問題1 onNext的處理問題2 cancel掉一個ProgressDialog的時候取消請求

    我們先來解決問題1

    5.1處理onNext

    我們希望這里能夠讓Activity或者Fragment自己處理onNext之后的邏輯,很自然的我們想到了用接口。問題還是泛型的問題,這里面我們必須指定明確的類型。所以接口還是需要泛型。

    我們先來定義一個接口,命名SubscriberOnNextListener

    public interface SubscriberOnNextListener { void onNext(T t);}

    代碼很簡單。再來看一下ProgressSubscriber現(xiàn)在的代碼

    public class ProgressSubscriber extends Subscriber { private SubscriberOnNextListener mSubscriberOnNextListener; private Context context; public ProgressSubscriber(SubscriberOnNextListener mSubscriberOnNextListener, Context context) { this.mSubscriberOnNextListener = mSubscriberOnNextListener; this.context = context; } @Override public void onStart() {} @Override public void onCompleted() { Toast.makeText(context, "Get Top Movie Completed", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { Toast.makeText(context, "error:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(T t) { mSubscriberOnNextListener.onNext(t); }}

    我知道傳Context不好,不過為了演示而已,大家可以自己封裝一下Toast。

    MainActivity使用是這樣的:

    先來定義一個SubscriberOnNextListener對象,可以在onCreate里面創(chuàng)建這個對象

    private SubscriberOnNextListener getTopMovieOnNext;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); getTopMovieOnNext = new SubscriberOnNextListener>() { @Override public void onNext(List subjects) { resultTV.setText(subjects.toString()); } };}

    getMovie方法這么寫:

    private void getMovie(){ HttpMethods.getInstance().getTopMovie(new ProgressSubscriber(getTopMovieOnNext, MainActivity.this), 0, 10);}

    這樣Activity或Fragment就只需要關(guān)注拿到結(jié)果之后的邏輯了,其他的完全不用操心。

    如需查看項目代碼 --> 代碼地址:

    https://github.com/tough1985/RxjavaRetrofitDemo

    選擇Tag -> step6

    5.2處理ProgressDialog

    我們希望當(dāng)cancel掉ProgressDialog的時候,能夠取消訂閱,也就取消了當(dāng)前的Http請求。所以我們先來創(chuàng)建個接口來處理這件事情。

    public interface ProgressCancelListener { void onCancelProgress();}

    然后我們用ProgressSubscriber來實現(xiàn)這個接口,這樣ProgressSubscriber就有了一個onCancelProgress方法,在這里面取消訂閱。

    @Overridepublic void onCancelProgress() { if (!this.isUnsubscribed()) { this.unsubscribe() ;}}

    然后我用了一個Handler來封裝了ProgressDialog。

    public class ProgressDialogHandler extends Handler { public static final int SHOW_PROGRESS_DIALOG = 1;public static final int DISMISS_PROGRESS_DIALOG = 2;private ProgressDialog pd;private Context context;private boolean cancelable;private ProgressCancelListener mProgressCancelListener;public ProgressDialogHandler(Context context, ProgressCancelListener mProgressCancelListener,boolean cancelable) { super(); this.context = context; this.mProgressCancelListener = mProgressCancelListener; this.cancelable = cancelable;}private void initProgressDialog(){ if (pd == null) { pd = new ProgressDialog(context); pd.setCancelable(cancelable); if (cancelable) { pd.setOnCancelListener(new DialogInterface.OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialogInterface) {mProgressCancelListener.onCancelProgress();}});}if (!pd.isShowing()) {pd.show();}}}private void dismissProgressDialog(){if (pd != null) {pd.dismiss();pd = null;}}@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case SHOW_PROGRESS_DIALOG:initProgressDialog();break;case DISMISS_PROGRESS_DIALOG:dismissProgressDialog();break;}}}

    Handler接收兩個消息來控制顯示Dialog還是關(guān)閉Dialog。創(chuàng)建Handler的時候我們需要傳入ProgressCancelListener的對象實例。

    最后貼出ProgressSubscriber的完整代碼:

    public class ProgressSubscriber extends Subscriber implements ProgressCancelListener{ private SubscriberOnNextListener mSubscriberOnNextListener; private ProgressDialogHandler mProgressDialogHandler; private Context context; public ProgressSubscriber(SubscriberOnNextListener mSubscriberOnNextListener, Context context) { this.mSubscriberOnNextListener = mSubscriberOnNextListener; this.context = context; mProgressDialogHandler = new ProgressDialogHandler(context, this, true); } private void showProgressDialog() { if (mProgressDialogHandler != null) { mProgressDialogHandler.obtainMessage(ProgressDialogHandler.SHOW_PROGRESS_DIALOG).sendToTarget(); } } private void dismissProgressDialog() { if (mProgressDialogHandler != null) { mProgressDialogHandler.obtainMessage(ProgressDialogHandler.DISMISS_PROGRESS_DIALOG).sendToTarget(); mProgressDialogHandler = null; } } @Override public void onStart() { showProgressDialog(); } @Override public void onCompleted() { dismissProgressDialog(); Toast.makeText(context, "Get Top Movie Completed", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { dismissProgressDialog(); Toast.makeText(context, "error:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(T t) { mSubscriberOnNextListener.onNext(t); } @Override public void onCancelProgress() { if (!this.isUnsubscribed()) { this.unsubscribe(); } }}

    目前為止,就封裝完畢了。以上是我在用Rxjava和Retrofit過程中踩過的一些坑,最后整合出來的,由于沒有在實際的項目中跑過,有問題的話希望能夠提出來大家討論一下,拍磚也歡迎。

    現(xiàn)在我們再寫一個新的網(wǎng)絡(luò)請求,步驟是這樣的:1. 在Service中定義一個新的方法。2. 在HttpMethods封裝對應(yīng)的請求(代碼基本可以copy)3. 創(chuàng)建一個SubscriberOnNextListener處理請求數(shù)據(jù)并刷新UI。

    最后

    如果你覺得寫更改線程的代碼覺得也很煩的話,可以把訂閱這部分也封裝起來:

    public void getTopMovie(Subscriber> subscriber, int start, int count){ //原來的樣子 // movieService.getTopMovie(start, count) // .map(new HttpResultFunc>()) // .subscribeOn(Schedulers.io()) // .unsubscribeOn(Schedulers.io()) // .observeOn(AndroidSchedulers.mainThread()) // .subscribe(subscriber); //修改之后的樣子 Observable observable = movieService.getTopMovie(start, count) .map(new HttpResultFunc>())toSubscribe(observable, subscriber);}//添加線程管理并訂閱private void toSubscribe(Observable o, Subscriber s){o.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(s);}

    讓你每次寫一個請求的時候,寫的代碼盡量少,更多的精力放在業(yè)務(wù)邏輯本身。

    最后的最后

    如果你的httpResult格式本身沒有問題,但是data中的內(nèi)容是這樣的:

    { "resultCode": 0, "resultMessage": "成功", "data": { "user": {}, "orderArray": [] }}

    這樣的情況還能不能繼續(xù)使用這樣的框架呢?我的解決方法是封裝一個類,把user和orderArray作為類的屬性。但是如果你的服務(wù)器一會data本身是一個完整的user數(shù)據(jù),一會又是這樣:"data": {"user": {}, "orderArray": []}那我覺得你有必要跟你的服務(wù)端好好聊聊了,請他吃頓飯和頓酒,大不了獻出菊花就是了。

    但是如果服務(wù)已經(jīng)上線了!!!

    對不起,騷年......

    老衲會在你墳前念300遍Thinking in java替你超度的~

    希望你用Retrofit和Rxjava的新體位能夠享受到新的高潮。

    總結(jié)

    以上是生活随笔為你收集整理的添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产一区免费在线 | 一区二区三区久久 | 国产糖心vlog在线观看 | 99精品热视频只有精品10 | 久久久网站 | 国产高清黄 | 国产精品一区二区在线观看免费 | 99精品视频在线播放免费 | 成人免费观看av | 国产精品亚洲片在线播放 | 国产99一区| 国产亚洲欧美一区 | 午夜性色| av在线播放一区二区三区 | 免费观看特级毛片 | 最新91在线视频 | 国产成人中文字幕 | 国产 字幕 制服 中文 在线 | 日日精品 | 亚洲美女视频在线 | 午夜免费在线观看 | 天天拍夜夜拍 | 成人av一区二区三区 | 国产精品久久嫩一区二区免费 | 日韩中文在线播放 | 久久精品久久综合 | 91免费试看 | 国产白浆视频 | 超碰av在线| 日韩中字在线观看 | 免费在线观看一区二区三区 | 91视视频在线直接观看在线看网页在线看 | av在线免费播放 | 久久免费看av | 日韩欧美在线综合网 | 成人免费看视频 | 婷婷丁香在线观看 | 久久久久久麻豆 | 日韩精品在线观看av | 在线国产日韩 | 三级av免费看 | 西西444www大胆无视频 | 国产精品24小时在线观看 | 99操视频 | 日韩一区二区三区免费视频 | 97电影在线观看 | 肉色欧美久久久久久久免费看 | 黄色福利视频网站 | 色香蕉在线 | 最新国产福利 | 亚洲有 在线 | 成人免费在线电影 | 亚洲欧洲一区二区在线观看 | 欧美激情第一页xxx 午夜性福利 | 久久精品女人毛片国产 | 在线观看免费av片 | 人人爱爱人人 | 国产精品二区三区 | 欧美色图狠狠干 | 干干干操操操 | 91av电影在线 | 久久久久久综合网天天 | 欧美一区二区三区四区夜夜大片 | 九九热精品视频在线播放 | 五月天色丁香 | 国产成人av电影在线观看 | 亚洲精品视频网 | 色 免费观看 | 午夜精品久久久久久久久久 | 日韩高清在线一区二区 | 久久国产精品免费一区 | 国产专区精品视频 | 91亚洲精品视频 | 91成人在线观看高潮 | 久久这里只有精品1 | 日日日操操 | 97伊人网| 韩国av免费看 | 欧美天天射 | 欧美男同网站 | 久久这里精品视频 | 麻豆91在线看| 久久毛片高清国产 | 日韩欧美一区二区在线 | 国产精品一区二区在线观看 | 国产在线视频导航 | 色九色| 性色av免费看 | 97香蕉视频| 日日夜夜免费精品 | 中文av在线免费观看 | 在线中文字幕播放 | 亚洲自拍偷拍色图 | 97人人艹 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 日韩一级精品 | 日本精品久久久久中文字幕5 | 日日操夜| 蜜臀av免费一区二区三区 | 国产精品一区二区美女视频免费看 | 开心激情婷婷 | 久久视频99| 精品视频专区 | 黄网在线免费观看 | 午夜久久影视 | 日韩av福利在线 | 国产v在线播放 | 综合国产视频 | 亚洲激情av| 国内精品小视频 | 日日干 天天干 | 精品91久久久久 | 色婷婷影视 | 成人a在线观看高清电影 | 亚洲成人免费在线 | 91成人天堂久久成人 | 久久免费福利 | 国产日韩中文在线 | 91九色porn在线资源 | 免费成人在线观看 | 国内精品免费 | 国产精品美女久久久久久免费 | 国产在线观看黄 | 天天干天天想 | 日韩亚洲在线视频 | 久久久久高清 | 国产在线日本 | 免费网站黄色 | 亚洲精品啊啊啊 | 久草在线久草在线2 | 午夜精品久久久久99热app | 不卡av电影在线观看 | 日韩精品在线免费观看 | 99精品视频在线观看 | 国产精品一区二区av影院萌芽 | 91色亚洲 | 亚洲视频在线免费观看 | 亚洲三级网站 | 91麻豆免费视频 | 精品在线播放视频 | 久久午夜鲁丝片 | 国产欧美久久久精品影院 | 久久97久久97精品免视看 | 亚洲综合五月 | 欧美日韩视频网站 | 国产午夜精品免费一区二区三区视频 | 国产精品久久久久9999吃药 | 999久久国精品免费观看网站 | 日日夜夜操av | 欧美国产视频在线 | 天天操天天操天天干 | 在线观看免费福利 | 2020天天干天天操 | 成人观看视频 | 国产高清视频在线 | 国产对白av | 婷婷丁香狠狠爱 | 成人禁用看黄a在线 | 探花视频在线观看+在线播放 | 午夜av在线免费 | 久久99久久精品 | 日本视频久久久 | 狠狠色噜噜狠狠狠狠2022 | 国产资源网 | 精品国产免费一区二区三区五区 | 国产香蕉97碰碰碰视频在线观看 | 国产精品毛片久久久久久久久久99999999 | 国产精品欧美久久久久天天影视 | 人人草人 | 国产一区二区三区黄 | 欧美久久久久久久久久久久久 | 亚洲艳情| 国产精品久久一区二区三区不卡 | 国产色在线,com | 亚洲涩涩网站 | 一区二区三区高清在线观看 | 欧美成人在线免费 | 91tv国产成人福利 | 久久毛片网站 | 日日干夜夜草 | 国产精品久久久久久久久久久久冷 | 国产 在线 高清 精品 | 国产精品久久久久久久久久久久午夜 | 国产精品视频地址 | 欧美日韩一区二区三区视频 | 悠悠av资源片 | 免费a网 | 99爱在线 | 国产精品高清一区二区三区 | 国产福利一区二区在线 | 亚欧日韩av| 五月丁婷婷| 国产中文在线视频 | 91精品专区 | 精品久久久久久久久久久久久久久久久久 | 人人看人人艹 | 伊人久久婷婷 | 免费黄色在线网址 | 欧美日韩国产页 | 亚洲免费视频观看 | 香蕉视频在线播放 | 亚洲精品大片www | 成人av在线影视 | 免费av大片 | 免费亚洲黄色 | 国产精品影音先锋 | 国产精品视频资源 | 国产亚洲精品久久 | 69国产盗摄一区二区三区五区 | 美女国内精品自产拍在线播放 | 国产成人精品一区二区在线 | 久久一区二区三区国产精品 | 国产一区高清在线观看 | 五月婷婷久久综合 | 婷婷色网 | 精品日韩中文字幕 | 99久久国产免费看 | 久久久久伦理电影 | 欧美视频在线观看免费网址 | 一区二区激情 | 婷婷久久综合九色综合 | 毛片在线播放网址 | 九九99靖品| 一区二区在线电影 | www.天天草 | 国产精品一区二区久久久 | 日本一区二区不卡高清 | 亚洲永久精品视频 | 亚洲国产偷 | 91亚洲精品久久久蜜桃网站 | 亚洲干视频在线观看 | 国色天香永久免费 | 香蕉手机在线 | 天天操天天拍 | 日韩成人中文字幕 | 日韩中文在线电影 | 国产九九九精品视频 | 国产 日韩 在线 亚洲 字幕 中文 | 在线va视频 | 玖玖色在线观看 | www.久久com | 国产精品入口a级 | 激情久久久久久久久久久久久久久久 | 99久久精品免费视频 | 国产不卡在线视频 | 99精品视频免费全部在线 | 久草在线视频首页 | 婷婷久久综合网 | 91经典在线 | 欧美作爱视频 | 精品国产视频在线 | 日韩欧美在线一区二区 | 91在线区 | av成人资源 | 久久激情影院 | 最近日本中文字幕a | 欧美在线观看视频一区二区三区 | 日日摸日日添夜夜爽97 | 久久天天躁狠狠躁亚洲综合公司 | 伊人久久国产精品 | 丁香婷婷综合激情 | 国产精品永久久久久久久久久 | 日韩电影中文字幕在线 | 日韩精品视频免费看 | 国产剧情av在线播放 | 久久的色| 在线免费观看羞羞视频 | 精品亚洲二区 | 国产视频高清 | 欧美日韩另类在线 | 精品国产伦一区二区三区 | 激情网站免费观看 | 蜜臀av一区二区 | 中文字幕在线免费观看视频 | 欧美色精品天天在线观看视频 | 就操操久久 | 狠狠操狠狠干2017 | 天天操天天舔天天干 | 91精品国产自产老师啪 | 91精品国产高清自在线观看 | 久久成人一区二区 | 天天摸天天舔天天操 | 4438全国亚洲精品观看视频 | 国产亚洲高清视频 | 香蕉视频国产在线观看 | 在线视频99| 日韩精品在线观看av | 免费污片 | 在线观av | 91视频在线网址 | 在线成人小视频 | 久久久99国产精品免费 | 国产色视频一区二区三区qq号 | 成人av中文字幕在线观看 | 日韩电影一区二区在线 | 国产裸体bbb视频 | 欧美大片在线观看一区 | 亚洲精品资源 | 国产精品中文 | 亚洲精品婷婷 | 久久久久久国产精品免费 | 色婷婷激情 | 黄色一级大片免费看 | 久久免费播放 | 中文字幕一区二区三区四区久久 | www.久久91 | 麻豆传媒电影在线观看 | 国产免费黄视频在线观看 | 97在线超碰 | 在线视频观看国产 | 中文字幕在线观看三区 | 人人添人人澡人人澡人人人爽 | 欧美日韩免费一区二区三区 | 日精品 | 99久久er热在这里只有精品15 | 国产亚洲成av人片在线观看桃 | 国产一区二区日本 | 91免费视频网站在线观看 | www.亚洲精品在线 | 国产精品久久久久久久久久东京 | 亚洲波多野结衣 | 欧美大片在线看免费观看 | 成人a v视频 | 国产青春久久久国产毛片 | 9热精品 | 成人18视频 | 久久公开视频 | 91精品国产欧美一区二区 | 国产精品久久久久久久久久99 | 欧美天天综合 | 亚洲永久字幕 | 国产在线专区 | 日日爽天天 | 国产美女精品久久久 | 国产精品第三页 | 四虎最新域名 | 91av在线国产| 久久高清毛片 | 国产一及片 | 国产午夜精品免费一区二区三区视频 | 人人玩人人爽 | 久久手机精品视频 | 黄色软件视频网站 | 日韩欧美视频在线免费观看 | 99热这里只有精品久久 | 日韩一区二区三区免费视频 | 999精品网| 成人在线视 | 美女搞黄国产视频网站 | 国产综合精品一区二区三区 | 久久精品激情 | 国产又粗又猛又黄视频 | 久久久久久久久久影视 | 精品国产欧美 | 精壮的侍卫呻吟h | 国产区网址 | 久久久久国产一区二区 | 亚洲高清视频在线观看 | 黄色av电影在线 | 国产黄色精品 | 国产免费一区二区三区最新 | 91视视频在线直接观看在线看网页在线看 | 在线不卡中文字幕播放 | 日本女人的性生活视频 | 色婷婷国产精品一区在线观看 | 国产亚洲婷婷免费 | 五月天婷婷在线视频 | 国产亚洲资源 | 日韩欧美第二页 | 欧洲成人免费 | 日日夜夜噜 | 久久综合国产伦精品免费 | 国产精品入口久久 | 国产免费作爱视频 | 人人擦| 亚洲精品动漫久久久久 | 成人久久久久久久久 | 欧美日韩精品免费观看 | 伊人亚洲精品 | 在线天堂中文www视软件 | 国内精品久久天天躁人人爽 | 丁香 久久 综合 | 超碰97人人射妻 | 日韩欧美在线免费观看 | 日韩一级电影在线 | 99国产在线视频 | 特级毛片aaa| 伊人丁香 | 成人午夜免费剧场 | 91免费视频网站在线观看 | 精品国产伦一区二区三区观看方式 | 国产丝袜在线 | 日日操狠狠干 | 亚洲蜜桃在线 | 麻豆传媒在线免费看 | 亚洲精品av在线 | 99精品在线免费在线观看 | 玖玖爱在线观看 | 精品久久久久久久久久久久久久久久 | 日本久久久影视 | 在线视频欧美日韩 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 久久国产一区二区 | 美女黄频视频大全 | 黄色一级动作片 | 黄色大全视频 | 欧美一级免费高清 | 久久精品一二三区白丝高潮 | 亚洲欧洲久久久 | 在线免费看片 | 国产精品久久久久久欧美 | 97人人模人人爽人人喊中文字 | 91正在播放| 国产精品一区在线播放 | 精品福利片 | 中文字幕av影院 | 激情综合一区 | 96久久欧美麻豆网站 | 五月婷婷六月丁香激情 | 最近中文字幕第一页 | 超碰97人人干 | 国内精品视频在线 | 一区三区视频在线观看 | 国产91综合一区在线观看 | 亚洲国产中文在线 | 在线高清av | 亚洲精品国产欧美在线观看 | 在线观看亚洲国产精品 | 欧美久久久久久久久 | 国产一区免费观看 | av线上看| 久久五月天色综合 | 亚洲精品视频二区 | 丁香视频全集免费观看 | 欧美另类69 | 成人在线播放视频 | 日韩色综合 | 久久精品看片 | 国产精品久久久久久欧美 | 欧美久久久久久久久久久 | 国产日韩精品一区二区在线观看播放 | 黄色小网站在线 | 国产精品久久久久久久久久久久午 | 国产欧美日韩精品一区二区免费 | 欧美在线视频二区 | 国产中文字幕国产 | 久久精品一二三区白丝高潮 | 91福利视频网站 | 亚洲一区天堂 | 中文字幕精品一区二区精品 | 91精品一区二区三区久久久久久 | 天天草天天干天天射 | 在线观看亚洲国产精品 | 午夜在线看片 | 日韩一级电影在线观看 | 一级黄色大片在线观看 | 婷婷四房综合激情五月 | 成人啪啪18免费游戏链接 | 永久免费av在线播放 | 69国产盗摄一区二区三区五区 | 欧美色综合久久 | av免费网站观看 | 精品人妖videos欧美人妖 | 欧美一级黄色网 | 国产一区二区手机在线观看 | 日韩欧美在线视频一区二区 | 91精品入口| 亚洲一区二区三区四区在线视频 | 久久久999精品视频 国产美女免费观看 | 国产 亚洲 欧美 在线 | 免费视频黄色 | 天堂网一区二区 | 欧美久久久久久久久久 | 超碰官网| 97精品国产97久久久久久春色 | 欧美热久久 | 免费三级影片 | 免费国产在线精品 | 成人午夜黄色 | 久久国产区 | 午夜电影一区 | 国产精品亚州 | 日本三级大片 | 99精品国自产在线 | 日韩精品免费一区二区三区 | 日日夜夜综合网 | 99精品偷拍视频一区二区三区 | 日韩免费在线网站 | 亚洲一级在线观看 | 天天爽网站 | 黄p网站在线观看 | 啪啪凸凸 | 成人黄色小说视频 | 亚洲国产影院 | 精品久久网站 | 午夜美女视频 | 丝袜制服综合网 | 高清精品久久 | av成人资源| 麻豆久久久久久久 | 国产大陆亚洲精品国产 | 娇妻呻吟一区二区三区 | 免费观看av网站 | 婷婷视频| 啪啪免费观看网站 | 又黄又爽又刺激视频 | 男女激情网址 | 伊甸园永久入口www 99热 精品在线 | 亚洲三级国产 | 中文字幕久久精品亚洲乱码 | 国产九色91 | 精品在线99 | 精品久久久久一区二区国产 | 久久国产精品久久精品 | 三级动图 | 天天色图| 国内免费的中文字幕 | 久久综合免费视频影院 | 六月丁香婷婷在线 | 超碰97人人爱 | 国产成人精品一区二区三区网站观看 | 91看片淫黄大片一级在线观看 | 不卡的一区二区三区 | 久久国产剧场电影 | 日韩中文字幕在线 | 香蕉视频亚洲 | 亚洲精品中文字幕视频 | 韩日精品在线 | 日日干夜夜爱 | 黄www在线观看 | 日本中文字幕在线一区 | 欧美精品九九 | 免费看黄在线观看 | .国产精品成人自产拍在线观看6 | 中文字幕视频一区二区 | 波多野结衣一区二区 | 偷拍福利视频一区二区三区 | 蜜桃av人人夜夜澡人人爽 | 欧美一区二区三区在线观看 | 夜夜操网站 | 奇米网网址| 久久精选视频 | www.色婷婷.com| 国产一级性生活 | 亚洲欧美日韩一二三区 | 精品国产乱码久久久久久1区二区 | 日韩免费三区 | 欧美人体xx | 国产精品一区二区在线观看免费 | 丁香久久婷婷 | 日韩网站在线看片你懂的 | 欧美日韩成人一区 | 四虎永久精品在线 | 久久久91精品国产 | 高潮毛片无遮挡高清免费 | 成人激情开心网 | 精品国产片 | 天天色综合天天 | 最近中文字幕高清字幕免费mv | 黄色大片日本 | 免费福利在线视频 | 一二三区av | 精品v亚洲v欧美v高清v | 成人在线视频一区 | 久久极品 | 国产精品精 | 亚洲精品视频在线观看免费视频 | 丁香婷婷激情国产高清秒播 | 午夜91在线| 国产91全国探花系列在线播放 | 欧美日韩在线免费观看视频 | 六月色丁 | 国产护士av | 中文字幕资源网在线观看 | 亚洲黄色网络 | 日本中文字幕在线电影 | 亚洲一区二区三区四区在线视频 | 黄色免费网 | 欧美成人va| 午夜少妇 | 精品一二三四在线 | 日韩视频在线观看免费 | 欧美激情视频久久 | 欧美日韩在线观看一区二区三区 | 国产永久免费高清在线观看视频 | 久久精品专区 | 精品国产不卡 | 国产精品久久av | 免费亚洲视频在线观看 | 99久久精品免费 | 国产一区二区不卡视频 | 99久久精品国 | 免费h在线观看 | 中文字幕av在线 | 成人免费观看在线视频 | 五月婷在线观看 | 午夜黄色一级片 | 超碰在线个人 | 久久久久久久18 | 麻豆精品视频 | 免费一级毛毛片 | 成人在线观看影院 | 日韩中文三级 | 中文字幕av在线免费 | 国产精品入口66mio女同 | 天天鲁一鲁摸一摸爽一爽 | 激情网站免费观看 | 免费a v在线| 色国产精品一区在线观看 | 中文字幕在线观看亚洲 | 在线视频你懂得 | 午夜精品久久久久久久久久 | 2021国产在线| 免费激情网 | 91手机视频在线 | 国产精品久久综合 | 99在线观看免费视频精品观看 | 久久久三级视频 | 激情动态| 999久久国产 | 日韩天天操 | 国产精品免费一区二区 | 午夜精品久久一牛影视 | 亚洲伊人网在线观看 | 伊人官网 | 黄污视频网站大全 | 久草在线视频免赞 | 日本性生活一级片 | 在线视频观看亚洲 | 狠狠的操| 日韩欧美69 | 久久在线免费观看 | 色狠狠综合 | 国产精品二区在线观看 | 欧美91精品久久久久国产性生爱 | 日本大尺码专区mv | 成人久久网 | 又黄又爽的免费高潮视频 | 婷婷丁香狠狠爱 | 欧美一级片在线免费观看 | 国产精品久久久久永久免费观看 | 91在线免费播放视频 | 免费在线观看污网站 | 91在线色| 蜜臀一区二区三区精品免费视频 | 免费亚洲片 | 亚洲欧洲国产日韩精品 | 日韩18p| 中文字幕在线免费观看视频 | 亚洲砖区区免费 | 日韩在线观看视频网站 | 国产成人精品网站 | 最新黄色av网址 | 17videosex性欧美 | 久久这里只精品 | 中文字幕精品在线 | a天堂最新版中文在线地址 久久99久久精品国产 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 日韩电影一区二区在线观看 | 在线观看91网站 | 91福利视频网站 | 日韩福利在线观看 | 久一网站| 久久激情片 | 国产精品人人做人人爽人人添 | 狠狠干网址 | 国内精品亚洲 | 久久经典国产 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 青青草国产精品 | 国产精品久久久久久吹潮天美传媒 | 日日夜夜免费精品 | 精品久久久影院 | 久久久国产成人 | 激情五月看片 | 9i看片成人免费看片 | 92av视频| 久久国产免 | 女人18精品一区二区三区 | 狠狠色噜噜狠狠狠合久 | 中文字幕在线视频第一页 | 青草视频在线 | 欧美五月婷婷 | 欧美日韩精品在线免费观看 | 日韩最新中文字幕 | 日韩欧美亚州 | 五月天六月婷 | 不卡av免费在线观看 | 免费观看一级特黄欧美大片 | 日韩精品观看 | 成人片在线播放 | 狠狠干天天 | 色国产在线 | 国产精品久久久久久久久久三级 | 久草99 | 综合久久久久久久 | 亚洲一区视频在线播放 | 国产网站在线免费观看 | 婷婷在线色| 国产精品不卡av | 亚洲91av | 国产综合精品久久 | 干 操 插 | 伊人射| 国产麻豆视频网站 | av网站手机在线观看 | 丁香婷婷网 | 99精品视频免费在线观看 | 黄色片网站 | 国产精品日韩高清 | 又长又大又黑又粗欧美 | 国产视频精品在线 | 91精品国产91久久久久久三级 | 日韩av伦理片| 亚洲欧美视频在线播放 | 亚洲精品1234区 | 黄色资源在线 | 香蕉视频网站在线观看 | 午夜av在线 | 欧美日韩国产mv | 四虎国产 | 国产一级片在线播放 | 国产精品一区在线观看 | 久久综合毛片 | 久久久久久久久久毛片 | 国产精品九九九九九 | 欧美日韩在线电影 | 久久免费一 | 91资源在线 | 亚洲成人家庭影院 | 免费观看完整版无人区 | 亚洲国产精品第一区二区 | 国产精品午夜8888 | 久久成熟 | 在线视频一区二区 | 精品一区在线 | 一级成人免费视频 | 精品国产一二三 | 国产一区二区视频在线播放 | 欧美精品亚洲精品 | 国产精品久久久久久久久久久久冷 | 一本大道久久精品懂色aⅴ 五月婷社区 | a视频在线看| 国产一区二区在线视频观看 | 成人a在线观看高清电影 | 欧美一区二区三区免费观看 | 狠狠色丁香婷婷综合橹88 | 青青河边草手机免费 | 国产精品成人久久久久 | 一区二三国产 | 91av资源网 | 91一区二区在线 | 日韩电影久久久 | 美女免费黄网站 | 一区二区三区中文字幕在线 | 开心丁香婷婷深爱五月 | 欧美va电影 | 国产精品美女久久久网av | 男女激情网址 | 精品欧美日韩 | 国产成人一区二区三区在线观看 | 久草在线综合 | 在线观看的黄色 | 亚洲国产精品成人女人久久 | 欧美成人在线免费观看 | 午夜精品一二区 | 69国产精品成人在线播放 | 国产成人av片 | 国产精品久久久久av福利动漫 | av手机在线播放 | 国产精品mv | 欧美精品亚州精品 | 99精品视频免费看 | 国产专区免费 | 在线观看www.| 国产麻豆成人传媒免费观看 | av在线播放一区二区三区 | 国产免费久久av | 黄色网中文字幕 | 国产分类视频 | 国产一级久久 | 国产精品久久久久久一二三四五 | a午夜在线 | 久久草在线免费 | 久久91久久久久麻豆精品 | 国产精品日韩久久久久 | 久久久久久久影院 | 网站免费黄色 | 国产视频综合在线 | 五月网婷婷 | 久久免费大片 | 欧美黑人xxxx猛性大交 | 欧美福利视频一区 | 久久久亚洲麻豆日韩精品一区三区 | 久草精品视频在线看网站免费 | 午夜视频二区 | 久久av观看 | 97国产大学生情侣酒店的特点 | 天天爱天天操天天爽 | 日韩天天操 | 国产91免费在线观看 | 色欧美日韩 | 日韩视频图片 | 在线观看麻豆av | 精品国产a| 香蕉视频在线观看免费 | 美女视频a美女大全免费下载蜜臀 | 一区二区三区免费在线播放 | 久操97 | 五月婷婷在线视频观看 | 日韩精品中文字幕有码 | 精品国产精品一区二区夜夜嗨 | 在线视频中文字幕一区 | 久久成人精品电影 | 国产在线视频一区二区 | 五月婷婷影视 | 国产不卡在线观看 | 天天天天天天天操 | 六月色丁| 亚洲免费视频观看 | 欧美午夜精品久久久久久孕妇 | 综合色中文 | 亚洲成人精品久久久 | 国产精品青青 | 久久久国产精品一区二区三区 | 中文字幕在线精品 | 亚洲 欧美 综合 在线 精品 | 亚洲免费婷婷 | 综合色狠狠 | 免费观看全黄做爰大片国产 | av手机版 | 国产免费观看高清完整版 | 麻豆视频免费看 | 91人人澡人人爽 | 天天操网址| 69热国产视频 | 日韩av片无码一区二区不卡电影 | 国产高清不卡在线 | freejavvideo日本免费 | 狠狠色丁香婷婷综合久久片 | 91av在线看 | 免费在线观看国产黄 | 美女久久久久久 | www.97色.com| 狠狠色丁香婷婷 | 日本aaaa级毛片在线看 | 国产精品观看视频 | 日本激情动作片免费看 | 色综合久久久久久久久五月 | 一级片黄色片网站 | 免费久久99精品国产婷婷六月 | 视频一区二区免费 | 国内成人精品视频 | 国产精品私人影院 | 成人午夜在线观看 | 日韩精品三区四区 | 一本一本久久aa综合精品 | 91av中文字幕| 97精品一区 | 久久精品综合视频 | www.综合网.com| 波多野结衣电影一区二区三区 | 在线观看中文字幕网站 | 丁香婷婷网| 欧美激情精品 | 人人爽久久涩噜噜噜网站 | 国产精品久久久久久五月尺 | 日本电影久久 | 日韩高清在线看 | 日韩三级久久 | 深夜国产在线 | 亚洲专区中文字幕 | 国产黄网在线 | 亚洲国产成人av网 | 国产999在线观看 | 国产破处精品 | 91热精品 | 99久久日韩精品视频免费在线观看 | 日本性生活一级片 | 婷婷狠狠操 | 午夜18视频在线观看 | 日韩色区| 婷婷五综合| 国产精品久久久久久久久久久杏吧 | 99视频免费观看 | 亚洲成av片人久久久 | 日韩一区在线播放 | 欧美成人黄色 | 亚洲视频 中文字幕 | 麻豆视频观看 | 婷五月激情 | 激情综合五月天 | 国产98色在线 | 日韩 | 少妇bbbb | 香蕉久久久久久久 | 国产真实精品久久二三区 | 999久久国产精品免费观看网站 | 成人污视频在线观看 | 国产精品久久久久久久久久久不卡 | 日韩欧美精品在线 | 欧美日韩不卡一区 | 免费a v在线 | 国产精品久久久久久久久免费 | 超碰在线公开 | 久久精品91视频 | 97久久精品午夜一区二区 | 日韩av二区 | www.com.日本一级| 91在线看| wwwwwww黄 | 天天干中文字幕 | 一本—道久久a久久精品蜜桃 | 麻豆视频免费在线 | 亚洲人成在线观看 | 欧美精品久久久久久久久久 | 婷婷久久综合九色综合 | 成人黄色短片 | 欧美极品少妇xxxx | 99这里都是精品 | 日韩精品大片 | 视频在线观看入口黄最新永久免费国产 | 久热久草在线 | 国内精品久久久久影院一蜜桃 | 国产麻豆精品95视频 | 成人黄色短片 | 国产福利一区二区三区在线观看 | 精品免费视频. | 中文字幕在线观看网址 | 国产视频中文字幕 | 精品久久网 | 国产精品资源在线 | 四虎影院在线观看av | 久久精品成人欧美大片古装 | 日韩高清一区 | 91精品国产91久久久久久三级 | 最新色视频 | 亚洲成人xxx| 99国产精品久久久久老师 | 波多野结衣一区三区 | av解说在线观看 | www免费看片com | 天天玩夜夜操 | 中文字幕999 | 精品久久一二三区 | 久久精品一区 | 91精品啪在线观看国产81旧版 | 国产一级性生活 | 99久久久国产免费 | 国产精品黄色 | 中文字幕久久精品亚洲乱码 | 免费中文字幕 | 国产老妇av | 久草在线播放视频 | 免费成人黄色av | 欧美精品国产综合久久 | 欧美国产91 | 国产视频日本 | av一区在线 | a在线观看免费视频 | 国产成人精品一区二区三区网站观看 | 中文字幕韩在线第一页 | 色久网| 最近最新中文字幕视频 | 成人午夜免费剧场 | av 一区 二区 久久 | 午夜10000 | 99国产精品久久久久老师 | 黄色.com| 伊人欧美| 国产精品久久久区三区天天噜 | 亚洲夜夜综合 | 狠狠干天天干 | 日韩网站免费观看 | 97干com| 亚洲成人软件 | 亚洲精品在线二区 | 日韩理论电影在线观看 | av在线播放亚洲 | 欧美日韩视频在线播放 | 久久精品成人欧美大片古装 | 国产精品无 | 五月婷婷丁香 | 日本精品久久久久中文字幕 | 毛片www | 欧美日韩视频一区二区 | 亚洲伊人色| 日韩高清av在线 | 人人看人人做人人澡 | 久草网站在线观看 | 偷拍福利视频一区二区三区 | 一区二区三区视频在线 | 日韩免费电影一区二区 | 成人在线观看网址 | 91av在线免费 | 久久久天堂 | 久草视频免费在线观看 | 在线播放日韩av | 五月天久久久久久 |