精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

快速了解異步編程 RxJava

開發 后端
本文介紹了java中對異步無阻賽這種編程模式的支持,主要提到了Future和CompletableFuture;之后有同學在下面留言提到了RxJava,剛好最近在看微服務設計這本書,里面提到了響應式擴展(Reactive extensions,Rx),而RxJava是Rx在JVM上的實現,所有打算對RxJava進一步了解。

前言

前段時間寫了一篇對協程的一些理解,里面提到了不管是協程還是callback,本質上其實提供的是一種異步無阻塞的編程模式;并且介紹了java中對異步無阻賽這種編程模式的支持,主要提到了Future和CompletableFuture;之后有同學在下面留言提到了RxJava,剛好最近在看微服務設計這本書,里面提到了響應式擴展(Reactive extensions,Rx),而RxJava是Rx在JVM上的實現,所有打算對RxJava進一步了解。

RxJava簡介

RxJava的官網地址:https://github.com/ReactiveX/RxJava

其中對RxJava進行了一句話描述:RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

大意就是:一個在Java VM上使用可觀測的序列來組成異步的、基于事件的程序的庫。

更詳細的說明在Netflix技術博客的一篇文章中描述了RxJava的主要特點:

  • 易于并發從而更好的利用服務器的能力。
  • 易于有條件的異步執行。
  • 一種更好的方式來避免回調地獄。
  • 一種響應式方法。

與CompletableFuture對比

之前提到CompletableFuture真正的實現了異步的編程模式,一個比較常見的使用場景:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(耗時函數);
Future<Integer> f = future.whenComplete((v, e) -> {
        System.out.println(v);
        System.out.println(e);
});
System.out.println("other...");

下面用一個簡單的例子來看一下RxJava是如何實現異步的編程模式:

bservable<Long> observable = Observable.just(1, 2)
        .subscribeOn(Schedulers.io()).map(new Func1<Integer, Long>() {
            @Override
            public Long call(Integer t) {
                try {
                    Thread.sleep(1000); //耗時的操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return (long) (t * 2);
            }
        });
observable.subscribe(new Subscriber<Long>() {
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }
    @Override
    public void onError(Throwable e) {
        System.out.println("error" + e);
    }
    @Override
    public void onNext(Long result) {
        System.out.println("result = " + result);
    }
});
System.out.println("other...");

Func1中以異步的方式執行了一個耗時的操作,Subscriber(觀察者)被訂閱到Observable(被觀察者)中,當耗時操作執行完會回調Subscriber中的onNext方法。

其中的異步方式是在subscribeOn(Schedulers.io())中指定的,Schedulers.io()可以理解為每次執行耗時操作都啟動一個新的線程。

結構上其實和CompletableFuture很像,都是異步的執行一個耗時的操作,然后在有結果的時候主動告訴我結果。那我們還需要RxJava干嘛,不知道你有沒有注意,上面的例子中其實提供2條數據流[1,2],并且處理完任何一個都會主動告訴我,當然這只是它其中的一項功能,RxJava還有很多好用的功能,在下面的內容會進行介紹。

異步觀察者模式

上面這段代碼有沒有發現特別像設計模式中的:觀察者模式;首先提供一個被觀察者Observable,然后把觀察者Subscriber添加到了被觀察者列表中;

RxJava中一共提供了四種角色:Observable、Observer、Subscriber、Subjects

Observables和Subjects是兩個被觀察者,Observers和Subscribers是觀察者;

當然我們也可以查看一下源碼,看一下jdk中的Observer和RxJava的Observer

jdk中的Observer:

public interface Observer {
    void update(Observable o, Object arg);
}

RxJava的Observer:

public interface Observer<T> {
    void onCompleted();
    void onError(Throwable e);
    void onNext(T t);
}

同時可以發現Subscriber是implements Observer的:

public abstract class Subscriber<T> implements Observer<T>, Subscription

可以發現RxJava中在Observer中引入了2個新的方法:onCompleted()和onError()

onCompleted():即通知觀察者Observable沒有更多的數據,事件隊列完結
onError():在事件處理過程中出異常時,onError()會被觸發,同時隊列自動終止,不允許再有事件發出。

正是因為RxJava提供了同步和異步兩種方式進行事件的處理,個人覺得異步的方式更能體現RxJava的價值,所以這里給他命名為異步觀察者模式

好了,下面正式介紹RxJava的那些靈活的操作符,這里僅僅是簡單的介紹和簡單的實例,具體用在什么場景下,會在以后的文章中介紹

Maven引入

<dependency>
    <groupId>io.reactivex</groupId>
    <artifactId>rxjava</artifactId>
    <version>1.2.4</version>
</dependency>

創建Observable

1.create()創建一個Observable,并為它定義事件觸發規則

Observable<Integer> observable = Observable
            .create(new Observable.OnSubscribe<Integer>() {
                @Override
                public void call(Subscriber<? super Integer> observer) {
                    for (int i = 0; i < 5; i++) {
                        observer.onNext(i);
                    }
                    observer.onCompleted();
                }
            });
observable.subscribe(new Observer<Integer>() {...});

2.from()可以從一個列表中創建一個Observable,Observable將發射出列表中的每一個元素

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items);
observable.subscribe(new Observer<Integer>() {...});

3.just()將傳入的參數依次發送出來

Observable<Integer> observable = Observable.just(1, 2, 3);
observable.subscribe(new Observer<Integer>() {...});

過濾Observable

1.filter()來過濾我們觀測序列中不想要的值

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).filter(
        new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer t) {
                return t == 1;
            }
        });
observable.subscribe(new Observer<Integer>() {...});

2.take()和taskLast()分別取前幾個元素和后幾個元素

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).take(3);
observable.subscribe(new Observer<Integer>() {...});
Observable<Integer> observable = Observable.from(items).takeLast(2);

3.distinct()和distinctUntilChanged()

distinct()過濾掉重復的值

List<Integer> items = new ArrayList<Integer>();
items.add(1);
items.add(10);
items.add(10);
Observable<Integer> observable = Observable.from(items).distinct();
observable.subscribe(new Observer<Integer>() {...});

distinctUntilChanged()列發射一個不同于之前的一個新值時讓我們得到通知

List<Integer> items = new ArrayList<Integer>();
items.add(1);
items.add(100);
items.add(100);
items.add(200);
Observable<Integer> observable = Observable.from(items).distinctUntilChanged();
observable.subscribe(new Observer<Integer>() {...});

4.first()和last()分別取***個元素和***一個元素

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
// Observable<Integer> observable = Observable.from(items).first();
Observable<Integer> observable = Observable.from(items).last();
observable.subscribe(new Observer<Integer>() {...});

5.skip()和skipLast()分別從前或者后跳過幾個元素

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
// Observable<Integer> observable = Observable.from(items).skip(2);
Observable<Integer> observable = Observable.from(items).skipLast(2);
observable.subscribe(new Observer<Integer>() {...});

6.elementAt()取第幾個元素進行發射

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).elementAt(2);
observable.subscribe(new Observer<Integer>() {...});

7.sample()指定發射間隔進行發射

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 50000; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).sample(1,TimeUnit.MICROSECONDS);
observable.subscribe(new Observer<Integer>() {...});

8.timeout()設定的時間間隔內如果沒有得到一個值則發射一個錯誤

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).timeout(1,TimeUnit.MICROSECONDS);
observable.subscribe(new Observer<Integer>() {...onError()...});

9.debounce()在一個指定的時間間隔過去了仍舊沒有發射一個,那么它將發射***的那個

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).debounce(1,TimeUnit.MICROSECONDS);
observable.subscribe(new Observer<Integer>() {...});

轉換Observable

1.map()接收一個指定的Func對象然后將它應用到每一個由Observable發射的值上

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).map(
        new Func1<Integer, Integer>() {
            @Override
            public Integer call(Integer t) {
                return t * 2;
            }
        });
observable.subscribe(new Observer<Integer>() {...});

2.flatMap()函數提供一種鋪平序列的方式,然后合并這些Observables發射的數據

final Scheduler scheduler = Schedulers.from(Executors.newFixedThreadPool(3));
List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).flatMap(
        new Func1<Integer, Observable<? extends Integer>>() {
            @Override
            public Observable<? extends Integer> call(Integer t) {
                List<Integer> items = new ArrayList<Integer>();
                items.add(t);
                items.add(99999);
                return Observable.from(items).subscribeOn(scheduler);
            }
        });
observable.subscribe(new Observer<Integer>() {...});

重要的一點提示是關于合并部分:它允許交叉。這意味著flatMap()不能夠保證在最終生成的Observable中源Observables確切的發射
順序。

3.concatMap()函數解決了flatMap()的交叉問題,提供了一種能夠把發射的值連續在一起的鋪平函數,而不是合并它們。
示例代碼同上,將flatMap替換為concatMap,輸出的結果來看是有序的

4.switchMap()和flatMap()很像,除了一點:每當源Observable發射一個新的數據項(Observable)時,它將取消訂閱并停止監視之前那個數據項產生的Observable,并開始監視當前發射的這一個。
示例代碼同上,將flatMap替換為switchMap,輸出的結果只剩***一個值

5.scan()是一個累積函數,對原始Observable發射的每一項數據都應用一個函數,計算出函數的結果值,并將該值填充回可觀測序列,等待和下一次發射的數據一起使用。

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Integer> observable = Observable.from(items).scan(
        new Func2<Integer, Integer, Integer>() {

            @Override             public Integer call(Integer t1, Integer t2) {
                System.out.println(t1 + "+" + t2);
                return t1 + t2;
            }
        });
observable.subscribe(new Observer<Integer>() {...});

6.groupBy()來分組元素

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<GroupedObservable<Integer, Integer>> observable = Observable
                .from(items).groupBy(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer t) {
                        return t % 3;
                    }
                });
observable.subscribe(new Observer<GroupedObservable<Integer, Integer>>() {
        @Override
        public void onNext(final GroupedObservable<Integer, Integer> t) {
            t.subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer value) {
                    System.out.println("key:" + t.getKey()+ ", value:" + value);
                }
            });

});

7.buffer()函數將源Observable變換一個新的Observable,這個新的Observable每次發射一組列表值而不是一個一個發射。

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<List<Integer>> observable = Observable.from(items).buffer(2);
observable.subscribe(new Observer<List<Integer>>() {...});

8.window()函數和 buffer()很像,但是它發射的是Observable而不是列表

List<Integer> items = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items.add(i);
}
Observable<Observable<Integer>> observable = Observable.from(items).window(2);
observable.subscribe(new Observer<Observable<Integer>>() {
    @Override
    public void onNext(Observable<Integer> t) {
        t.subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer t) {
                System.out.println("this Action1 = " + this+ ",result = " + t);
            }
        });
        //onCompleted和onError
});

9.cast()它將源Observable中的每一項數據都轉換為新的類型,把它變成了不同的Class

List<Father> items = new ArrayList<Father>();
items.add(new Son());
items.add(new Son());
items.add(new Father());
items.add(new Father());
Observable<Son> observable = Observable.from(items).cast(Son.class);
observable.subscribe(new Observer<Son>() {...});

class Father {
}

class Son extends Father {
}

組合Observables

1.merge()方法將幫助你把兩個甚至更多的Observables合并到他們發射的數據項里

List<Integer> items1 = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items1.add(i);
}
List<Integer> items2 = new ArrayList<Integer>();
for (int i = 5; i < 10; i++) {
    items2.add(i);
}
Observable<Integer> observable1 = Observable.from(items1);
Observable<Integer> observable2 = Observable.from(items2);
Observable<Integer> observableMerge = Observable.merge(observable1,observable2);
observable.subscribe(new Observer<Integer>() {...});

2.zip()合并兩個或者多個Observables發射出的數據項,根據指定的函數 Func* 變換它們,并發射一個新值

List<Integer> items1 = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
    items1.add(i);
}
List<Integer> items2 = new ArrayList<Integer>();
for (int i = 5; i < 10; i++) {
    items2.add(i);
}
Observable<Integer> observable1 = Observable.from(items1);
Observable<Integer> observable2 = Observable.from(items2);
Observable<Integer> observableZip = Observable.zip(observable1,
        observable2, new Func2<Integer, Integer, Integer>() {
            @Override             public Integer call(Integer t1, Integer t2) {
                return t1 * t2;
            }
        });
observable.subscribe(new Observer<Integer>() {...});

3.combineLatest()把兩個Observable產生的結果進行合并,這兩個Observable中任意一個Observable產生的結果,都和另一個Observable***產生的結果,按照一定的規則進行合并。

Observable<Long> observable1 = Observable.interval(1000,TimeUnit.MILLISECONDS);
Observable<Long> observable2 = Observable.interval(1000,TimeUnit.MILLISECONDS);
Observable.combineLatest(observable1, observable2,
        new Func2<Long, Long, Long>() {
            @Override
            public Long call(Long t1, Long t2) {
                System.out.println("t1 = " + t1 + ",t2 = " + t2);
                return t1 + t2;
            }
        }).subscribe(new Observer<Long>() {...});
Thread.sleep(100000);

4.join()類似combineLatest(),但是join操作符可以控制每個Observable產生結果的生命周期,在每個結果的生命周期內,可以與另一個Observable產生的結果按照一定的規則進行合并

Observable<Long> observable1 = Observable.interval(1000,
                TimeUnit.MILLISECONDS);
        Observable<Long> observable2 = Observable.interval(1000,
                TimeUnit.MILLISECONDS);
        observable1.join(observable2, new Func1<Long, Observable<Long>>() {
            @Override
            public Observable<Long> call(Long t) {
                System.out.println("left=" + t);
                return Observable.just(t).delay(1000, TimeUnit.MILLISECONDS);
            }
        }, new Func1<Long, Observable<Long>>() {
            @Override
            public Observable<Long> call(Long t) {
                System.out.println("right=" + t);
                return Observable.just(t).delay(1000, TimeUnit.MILLISECONDS);
            }
        }, new Func2<Long, Long, Long>() {
            @Override
            public Long call(Long t1, Long t2) {
                return t1 + t2;
            }
        }).subscribe(new Observer<Long>() {
            @Override
            public void onCompleted() {
                System.out.println("Observable  completed");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("Oh,no!  Something   wrong   happened!");
            }

            @Override
            public void onNext(Long t) {
                System.out.println("[result=]" + t);
            }
        });

        Thread.sleep(100000);

5.switchOnNext()把一組Observable轉換成一個Observable,對于這組Observable中的每一個Observable所產生的結果,如果在同一個時間內存在兩個或多個Observable提交的結果,只取***一個Observable提交的結果給訂閱者

Observable<Observable<Long>> observable = Observable.interval(2, TimeUnit.SECONDS)
        .map(new Func1<Long, Observable<Long>>() {
            @Override
            public Observable<Long> call(Long aLong) {
                return Observable.interval(1, TimeUnit.MILLISECONDS).take(5);
            }
        }).take(2);

Observable.switchOnNext(observable).subscribe(new Observer<Long>() {...});
Thread.sleep(1000000);

6.startWith()在Observable開始發射他們的數據之前,startWith()通過傳遞一個參數來先發射一個數據序列

Observable.just(1000, 2000).startWith(1, 2).subscribe(new Observer<Integer>() {...});

總結

本文主要對rxjava進行了簡單的介紹,從異步編程這個角度對rxjava進行了分析;并且針對Observable的過濾,轉換,組合的API進行了簡單的介紹,當然我們更關心的是rxjava有哪些應用場景。

責任編輯:張燕妮 來源: 博客
相關推薦

2013-04-01 15:38:54

異步編程異步編程模型

2013-01-21 13:18:26

IBMdW

2024-04-30 11:11:33

aiohttp模塊編程

2015-08-21 10:06:09

rxjava數據

2020-10-15 13:29:57

javascript

2013-04-01 15:25:41

異步編程異步EMP

2015-08-26 16:17:49

OpenStack OpenStack 架開源云平臺

2011-02-22 09:09:21

.NETAsync CTP異步

2011-02-22 08:49:16

.NET同步異步

2021-03-03 08:45:38

IO驅動式Linux

2017-07-13 12:12:19

前端JavaScript異步編程

2016-09-07 20:43:36

Javascript異步編程

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2009-11-13 15:55:52

Oracle哈希連接

2023-11-06 09:24:14

CSS相對顏色

2022-08-04 18:50:12

Navigator瀏覽器設備

2021-11-22 22:14:46

JavaScript開發模塊

2009-11-17 09:47:54

Oracle SQL語

2011-11-11 15:47:22

JavaScript
點贊
收藏

51CTO技術棧公眾號

日韩在线观看中文字幕| 黄色网址在线免费观看| 久久久久久婷| 日韩中文字幕国产精品| 青娱乐精品在线| 日本在线影院| 综合精品久久久| 久久精品国产精品青草色艺| 中文字幕日本视频| 欧美福利影院| 亚洲性无码av在线| 一区二区在线免费观看视频| av日韩电影| 亚洲精品午夜久久久| 免费一区二区三区在在线视频| 国产精品久久久久久久成人午夜| 日韩午夜免费| 久久精品人人爽| 99久久久久久久久久| 日韩成人在线一区| 精品毛片三在线观看| 一区二区三区在线观看www| 日本激情一区二区三区| 精品一区二区三区免费| 日本不卡高字幕在线2019| 日韩欧美综合视频| 第一会所sis001亚洲| 亚洲大胆美女视频| 亚洲国产欧美91| 黄色精品视频| 欧美三级欧美成人高清www| 中文字幕乱码免费| 色综合久久影院| 久久伊99综合婷婷久久伊| 999视频在线观看| 亚洲一级视频在线观看| 日韩高清不卡一区二区三区| 海角国产乱辈乱精品视频| 美女的奶胸大爽爽大片| 国产精品成人一区二区不卡| 亚洲网站视频福利| 亚洲欧美色图视频| 久久久亚洲欧洲日产| 日韩一级黄色大片| 五月天六月丁香| 91麻豆精品一二三区在线| 欧美日韩在线播放一区| 人人干人人视频| 日韩天堂在线| 欧美午夜不卡在线观看免费| 一级特黄性色生活片| 老司机2019福利精品视频导航| 亚洲高清中文字幕| www.亚洲视频.com| 国产色婷婷在线| 亚洲国产另类av| 免费人成在线观看视频播放| 天堂8中文在线| 亚洲综合激情网| 大陆av在线播放| rebdb初裸写真在线观看| 亚洲福利视频一区| 欧美啪啪免费视频| 高清不卡亚洲| 欧美羞羞免费网站| 岛国av免费在线| 精品国产18久久久久久二百| 日韩三级免费观看| 无码人妻精品一区二区三| 果冻天美麻豆一区二区国产| 亚洲级视频在线观看免费1级| 最新版天堂资源在线| 亚洲丁香日韩| 在线一区二区日韩| 日韩精品一区二区亚洲av性色| 欧美激情1区2区| 久久欧美在线电影| 精品人妻一区二区三区潮喷在线| 日韩电影在线一区| 亚洲在线观看视频网站| 乱精品一区字幕二区| 91丨九色丨黑人外教| 日本视频精品一区| 黄色片网站在线观看| 亚洲综合久久久久| 国产熟人av一二三区| 色综合视频一区二区三区44| 精品日本一线二线三线不卡| 国产成人精品无码片区在线| 狠狠色狠狠色综合婷婷tag| xxxxxxxxx欧美| 日韩精品久久久久久久| 免费看精品久久片| 国产精品久久亚洲7777| 精品三级久久久久久久电影聊斋| 中文字幕一区二区三| 久久av综合网| 国产亚洲人成a在线v网站| 日韩欧美三级在线| 怡红院一区二区三区| 你懂的一区二区| 日韩免费高清在线观看| 成人av手机在线| 欧美激情在线一区二区三区| 国产精品第157页| 日韩色淫视频| 日韩av最新在线观看| 黄色录像一级片| 久久午夜精品一区二区| av资源站久久亚洲| 9191在线观看| 欧美日韩在线第一页| 爱情岛论坛亚洲自拍| 国产亚洲欧美日韩在线观看一区二区| 久久av.com| 中文字幕永久免费视频| 92精品国产成人观看免费 | 女同一区二区三区| 久久精品亚洲一区| 波多野结衣午夜| 99久久久免费精品国产一区二区| 最新不卡av| 精品91久久| 日韩精品在线电影| 国产精品99精品| 国产成人自拍高清视频在线免费播放| 视频一区二区综合| 手机看片久久| 精品一区二区三区三区| 日韩福利片在线观看| 国产精品亚洲а∨天堂免在线| 亚洲一卡二卡三卡| 唐人社导航福利精品| 精品无人区太爽高潮在线播放 | 欧美另类综合| 国产精品一区二区三区在线播放| 精品av中文字幕在线毛片| 亚洲成人av资源| 亚洲乱妇老熟女爽到高潮的片| 欧美h版在线| 国产精品爽黄69| 77导航福利在线| 欧美日韩免费在线视频| 欧美激情 一区| 日韩国产精品久久| 日韩欧美精品在线不卡| 性欧美hd调教| 国产一区二区三区中文| 无码人妻黑人中文字幕| 国产亚洲一区字幕| 日韩欧美精品在线观看视频| 一个色免费成人影院| 欧美一级淫片aaaaaaa视频| 全部免费毛片在线播放一个| 天天综合日日夜夜精品| 中文字幕一区二区三区人妻| 玖玖在线精品| 亚洲人成网站在线观看播放| 四虎国产精品成人免费影视| 日日狠狠久久偷偷四色综合免费 | 天堂资源在线| 亚洲美女在线看| 欧美日韩在线视频播放| 国产精品久久久久桃色tv| 拔插拔插华人永久免费| 欧美三级不卡| 国产一区二区三区高清视频| 樱桃视频成人在线观看| 伊人久久久久久久久久久久久| 国产91av在线播放| 亚洲丝袜精品丝袜在线| 中文字幕永久免费| 亚洲伊人网站| 先锋影音欧美| 99re91这里只有精品| 欧亚精品在线观看| 91大神xh98hx在线播放| 日韩免费电影一区| 中文字幕一区在线播放| 亚洲欧美综合网| 熟妇高潮一区二区| 老牛影视一区二区三区| 尤物一区二区三区| 风间由美性色一区二区三区四区 | 一区二区视频| 热久久免费视频精品| 黄网站在线播放| 亚洲激情小视频| 在线观看xxxx| 午夜视频在线观看一区| 欧美丰满老妇熟乱xxxxyyy| 国产乱子轮精品视频| 日韩伦理在线免费观看| 欧美先锋资源| 国产免费一区二区| 成人在线免费电影网站| 久久久久久高潮国产精品视| 国产一级片在线| 日韩精品专区在线影院观看 | 日韩av成人高清| 无颜之月在线看| 精品视频免费| 精品免费国产| 欧美日韩黄网站| 国产精品免费一区豆花| 高清电影在线观看免费| 色妞久久福利网| 无码精品人妻一区二区三区影院| 欧美性色aⅴ视频一区日韩精品| 欧美片一区二区| 国产精品麻豆久久久| 国产成人无码一区二区在线观看| 国内欧美视频一区二区| 日本va中文字幕| 亚洲每日在线| 日韩精品一区二区三区四| 日韩av专区| 欧美高清视频一区| 精品视频高潮| 国产精品.com| 日本高清精品| 91久久国产综合久久91精品网站 | 欧美亚洲丝袜传媒另类| 国产一级在线免费观看| 国产精品国产馆在线真实露脸| 国产美女喷水视频| 成人国产视频在线观看| ass极品水嫩小美女ass| 久久精品免费观看| 日本免费观看网站| 日韩电影免费一区| 50路60路老熟妇啪啪| 一本久道久久综合狠狠爱| 亚洲理论电影在线观看| 欧美日韩一卡| 97中文字幕在线| 精品福利电影| 97视频在线免费| 亚洲理伦在线| 国产成人无码精品久久久性色| 黄色精品网站| 黄色大片中文字幕| 亚洲激情综合| 97超碰青青草| 香蕉精品999视频一区二区| 日韩网址在线观看| 亚洲欧美视频| 国产性生交xxxxx免费| 久久久噜噜噜| 99视频在线视频| 久久国产免费看| 九一精品久久久| 国产精品12区| 黑人玩弄人妻一区二区三区| av在线不卡电影| 日韩网站在线播放| 91麻豆高清视频| 欧美黄色一级生活片| 国产偷国产偷精品高清尤物| 一二三四在线观看视频| 亚洲日穴在线视频| 久久这里只有精品免费| 亚洲成在人线免费| 狠狠人妻久久久久久| 欧美性videosxxxxx| 91精品在线视频观看| 日韩一区二区三区电影| 天堂中文网在线| 一个人看的www久久| 麻豆tv免费在线观看| 欧美黑人xxxx| 韩国成人动漫| 91精品国产自产在线| 白嫩白嫩国产精品| 久久久com| 999成人精品视频线3| 国产一二三区在线播放| 亚洲综合国产激情另类一区| 国产一二三区av| 国产成人在线影院| 亚洲国产天堂av| 亚洲情趣在线观看| 精品美女久久久久| 欧美三级日韩在线| 午夜免费福利视频| 亚洲欧洲高清在线| 高清全集视频免费在线| 91国内免费在线视频| 精品176极品一区| 国产一区喷水| 99视频精品全部免费在线视频| 欧美国产日韩激情| 久久97超碰国产精品超碰| youjizz.com国产| 中文av一区二区| 国产黄色片视频| 欧美电影一区二区三区| 亚洲欧美日韩免费| 久久久999成人| 日韩av首页| 精品卡一卡二| 91精品天堂福利在线观看| 国产成人a亚洲精v品无码| 国产一区二区三区在线观看免费| 性色av蜜臀av色欲av| 最新中文字幕一区二区三区| www.com亚洲| 亚洲国产古装精品网站| 国产黄色在线网站| 日韩免费av片在线观看| 久久九九热re6这里有精品| 国产精品一二三在线观看| 老**午夜毛片一区二区三区 | 亚洲精品第五页| 色偷偷88888欧美精品久久久| 成av人片在线观看www| 91色视频在线观看| 日韩aaaa| 人妻丰满熟妇av无码区app| av在线这里只有精品| 久草视频免费播放| 欧美一区二区三区视频免费 | 久久久综合av| 欧美成人精品一级| 亚洲一区二区三区乱码| 视频一区视频二区中文| www.超碰97| 午夜精品视频在线观看| 亚洲国产精品国自产拍久久| 久久综合久中文字幕青草| a成人v在线| 五月婷婷一区| 日本视频中文字幕一区二区三区| av网站免费在线播放| 亚洲一区二区三区视频在线 | 日韩久久一区| 亚洲国产日韩欧美| 日韩黄色片在线观看| 欧美 日韩 成人| 在线免费精品视频| 国产高清视频在线观看| 国产精品高精视频免费| 精品国产乱码久久久久久1区2匹| 97在线播放视频| 国产人妖乱国产精品人妖| 久久精品99北条麻妃| 国产亚洲精品美女| 日韩精品免费观看视频| 日韩精品国内| 久久精品国产999大香线蕉| 国产不卡在线观看视频| 欧美日韩卡一卡二| 里番在线观看网站| 成人伊人精品色xxxx视频| 国产精品不卡| 麻豆tv在线观看| 岛国av一区二区在线在线观看| 视频二区在线| 国产精品美女久久久久av超清| 欧美顶级大胆免费视频| 中文字幕在线视频一区二区| 一区二区高清视频在线观看| 国产成人手机在线| 欧美与欧洲交xxxx免费观看| 国产精品羞羞答答在线观看| 奇米影音第四色| 亚洲乱码国产乱码精品精98午夜| 国产刺激高潮av| 日本精品在线视频| 日韩精品中文字幕第1页| 亚洲av无日韩毛片久久| 亚洲国产婷婷综合在线精品| 男人天堂亚洲二区| 国产欧美精品日韩| 欧美午夜视频| 久久久久亚洲av成人无码电影| 欧美喷水一区二区| 成人性生交大片免费看网站| 欧美日韩精品综合| 精品一区二区三区在线观看| 亚洲精品www久久久久久| 亚洲一级黄色片| 日韩一区二区三区在线看| 99精品人妻少妇一区二区| 国产精品乱码一区二三区小蝌蚪| 午夜精品久久久久久久99| 欧洲精品在线视频| 外国成人免费视频| 久久偷拍免费视频| 91精品国产综合久久精品| 国产拍在线视频| japanese在线视频| 91麻豆123| 亚洲精品国产精| 国产精品一二区| 99精品国产99久久久久久福利| 国产白丝一区二区三区| 亚洲国产精品久久久久久| 日韩国产91| 日本熟妇人妻xxxxx|