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

談談OkHttp源碼的同步異步原理

開發 前端
面試中遇到了okhttp同步異步問題,今天稍微總結下。

1、okhttp工作的大致流程

  • 當我們通過OkhttpClient創建一個Call,并發起同步或異步請求時。
  • okhttp會通過Dispatcher對我們所有的RealCall(Call的具體實現類)進行統一管理,并通過execute()及enqueue()方法對同步或異步請求進行處理。
  • execute()及enqueue()這兩個方法會最終調用RealCall中的getResponseWithInterceptorChain()方法,從攔截器鏈中獲取返回結果。
  • 攔截器鏈中,依次通過RetryAndFollowUpInterceptor(重定向攔截器)、BridgeInterceptor(橋接攔截器)、CacheInterceptor(緩存攔截器)、ConnectInterceptor(連接攔截器)、CallServerInterceptor(網絡攔截器)對請求依次處理,與服務的建立連接后,獲取返回數據,再經過上述攔截器依次處理后,最后將結果返回給調用方。
  • 同步請求就是執行請求的操作是阻塞式,直到 HTTP 響應返回。它對應 OKHTTP 中的 execute 方法。
  • 異步請求就類似于非阻塞式的請求,它的執行結果一般都是通過接口回調的方式告知調用者。它對應 OKHTTP 中的 enqueue 方法。

OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.test.com")
.build();
Call call = okHttpClient.newCall(request);
//1.異步請求,通過接口回調告知用戶 http 的異步執行結果
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
System.out.println(response.body().string());
}
}
});
//2.同步請求
Response response = call.execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
}

2、異步請求實現流程

//get的異步請求
public void getAsync(View view) {
//定義okhttp對象
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://www.test.com").build();
Call call = okHttpClient.newCall(request);
//異步請求:不用創建子線程
//enqueue()并不會阻塞代碼的執行,不需要與服務器請求完成之后,才會執行后面的代碼
//而且enqueue內部會為我們創建子線程
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.i("TAG", "onResponse: " + (Looper.getMainLooper().getThread() == Thread.currentThread()));//為false 表示這是在子線程,需要切換到主線程才能操作UI
if (response.isSuccessful()){
Log.i(TAG,"getAsync:"+response.body().string());
}
}
});
}

call的異步調用是通過RealCall.enqueue()實現的。而請求結果通過Callback回調到主線程。

(1)RealCall.enqueue()

@Override public void enqueue(Callback responseCallback) {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
transmitter.callStart();
client.dispatcher().enqueue(new AsyncCall(responseCallback));
}

將用戶創建的callback作為參數傳入AsyncCall()構造函數。AsyncCall 繼承于Runnable。

(2)AsyncCall

final class AsyncCall extends NamedRunnable {
private volatile AtomicInteger callsPerHost = new AtomicInteger(0);
...
/**
* 該方法是在dispather需要執行此請求的時候,分配給它線程池,此異步請求便在這個線程池中執行網絡請求。
*/
void executeOn(ExecutorService executorService) {
...
boolean success = false;
try {
//異步的關鍵:將請求放到線程池中執行。
executorService.execute(this);
success = true;
} catch (RejectedExecutionException e) {
...
success = false;
} finally {
if (!success) {
client.dispatcher().finished(this); // 執行失敗會通過Dispatcher進行finished,以后再也不會用此AsyncCall。
}
}
}
@Override protected void execute() {
boolean signalledCallback = false;
transmitter.timeoutEnter();
try {
Response response = getResponseWithInterceptorChain();
signalledCallback = true;
//請求成功時,回調Response給到用戶
responseCallback.onResponse(RealCall.this, response);
} catch (IOException e) {
...
//請求錯誤時,回調錯誤接口給到用戶
responseCallback.onFailure(RealCall.this, e);
} finally {
//結束一次請求。
client.dispatcher().finished(this);
}
}
}

  AsyncCall繼承于Runnable,它提供了將Call放到線程池執行的能力,實現了請求的異步流程。

(3)Dispatcher.enqueue()

//準備進行異步調用的請求。
private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();
//正在執行的異步請求。
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();
void enqueue(AsyncCall call) {
synchronized (this) {
//將異步請求加入到雙端隊列中
readyAsyncCalls.add(call);
// 尋找是否有同Host的請求,如果有進行復用
if (!call.get().forWebSocket) {
AsyncCall existingCall = findExistingCallWithHost(call.host());
if (existingCall != null) call.reuseCallsPerHostFrom(existingCall);
}
}
//將符合條件的Ready的異步請求轉入runningAsyncCalls,并執行
promoteAndExecute();
}

  •   將此請求登記到Dispatcher的預備雙端隊列中。
  • 以此次的請求的Host來查找可服用的異步請求,如果存在,進行復用。
  • 嘗試將剛剛加入預備隊的請求執行。

(4)Dipatcher.finish()

private <T> void finished(Deque<T> calls, T call) {
Runnable idleCallback;
synchronized (this) {
...
//一個請求完成后,檢查此時是否有在等待執行的請求,并處理。
boolean isRunning = promoteAndExecute();
if (!isRunning && idleCallback != null) {
//通知此時已經沒有異步請求任務
idleCallback.run();
}
}

  •  調度器結束一次請求。
  • 當一個異步任務完成后,調度器會觸發一次預備任務執行流程。讓之前因為最大請求數等限制而不能執行的請求有機會得到執行。
  • 通過idleCallback.run()通知此時的調度器空閑狀態。

(5)Dipatcher.promoteAndExecute()

private boolean promoteAndExecute() {
...
List<AsyncCall> executableCalls = new ArrayList<>();
boolean isRunning;
synchronized (this) {
for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) {
AsyncCall asyncCall = i.next();
//檢查最大請求數限制和
if (runningAsyncCalls.size() >= maxRequests) break;
if (asyncCall.callsPerHost().get() >= maxRequestsPerHost) continue;
//滿足條件,便把預備隊的請求提升到執行隊列。
i.remove();
asyncCall.callsPerHost().incrementAndGet();
executableCalls.add(asyncCall);
runningAsyncCalls.add(asyncCall);
}
isRunning = runningCallsCount() > 0;
}
//將可執行的異步請求放進線程池執行
for (int i = 0, size = executableCalls.size(); i < size; i++) {
AsyncCall asyncCall = executableCalls.get(i);
//
asyncCall.executeOn(executorService());
}
return isRunning;

  • 該方法是對預備隊列里的請求提升至執行隊列并執行的一次嘗試。
  • 如果不能執行,他啟動時機將會延后到其他請求結束。

3、同步請求

public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}

  • 通過Builder模式構建Request。
  • 調用client.newCall(),通過request生成一個Call對象。他的實現類是RealCall。
  • 隨后調用RealCall.execute(),進行同步請求。

(1)RealCall.execute()

@Override public Response execute() throws IOException {
synchronized (this) {
// 如果該請求已經執行過,報錯。
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
transmitter.timeoutEnter();
transmitter.callStart();
try {
//獲取 client 里面的調度器 Dispatcher 并記錄這個請求。
client.dispatcher().executed(this);
//通過責任鏈的方式將發起請求并返回結果。這里是同步動作,會阻塞。
return getResponseWithInterceptorChain();
} finally {
//請求完后需要把這個請求從調度器中移走
client.dispatcher().finished(this);
}
}

  •  判斷Call的合法性。
  • 將RealCall傳進Client里面的Dispatcher.executed()里,而Dispatcher是在 OkHttpClient 被的構建函數里被創建并作為成員變量的。
  • 開啟責任鏈模式,進行請求相關邏輯。
  • 執行完成后,調度器對這個請求進行收尾工作。

(2)Dispatcher.executed()

/** Running asynchronous calls. Includes canceled calls that haven't finished yet. */
private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();
synchronized void executed(RealCall call) {
runningSyncCalls.add(call);
}

(3)RealCall.getResponseWithInterceptorChain()

Response getResponseWithInterceptorChain() throws IOException {
// 將請求的具體邏輯進行分層,并采用責任鏈的方式進行構造。
List<Interceptor> interceptors = new ArrayList<>();
// 用戶自已的請求攔截器
interceptors.addAll(client.interceptors());
//重試和重定向攔截器
interceptors.add(new RetryAndFollowUpInterceptor(client));
//橋攔截器
interceptors.add(new BridgeInterceptor(client.cookieJar()));
//緩存邏輯攔截器
interceptors.add(new CacheInterceptor(client.internalCache()));
//網絡連接邏輯攔截器
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
// 網絡請求攔截器,真正網絡通行的地方,這個攔截器處理過后會生成一個Response
interceptors.add(new CallServerInterceptor(forWebSocket));
//依照如上配置,構建出一個請求的處理邏輯責任鏈,特別注意:這條鏈開始于下標位置為的0攔截器。
Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 0,
originalRequest, this, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
boolean calledNoMoreExchanges = false;
try {
//按下處理邏輯鏈條的開關。
Response response = chain.proceed(originalRequest);
if (transmitter.isCanceled()) {
closeQuietly(response);
throw new IOException("Canceled");
}
//返回請求結果
return response;
} catch (IOException e) {
calledNoMoreExchanges = true;
throw transmitter.noMoreExchanges(e);
} finally {
if (!calledNoMoreExchanges) {
transmitter.noMoreExchanges(null);
}
}
}

  • 將用戶自定義的攔截器先加入集合中。
  • 加入一次請求中需要用的攔截器,這些攔截器代表一次完整的網絡請求邏輯被分了幾層以及他們的先后順序。從代碼中我們不難看出他們的流程是:重試/重定向邏輯->網絡橋邏輯->緩存邏輯->建立網絡連接邏輯->網絡通行邏輯。
  • 用以上攔截器集合構建出一條邏輯處理的攔截鏈,并將這條鏈需要使用的攔截器下標賦值為0,從第一個開始。
  • 調用chain.proceed()啟動這條鏈的處理流程。
  • 使用責任鏈的設計模式來處理一次網絡請求中的邏輯可以有效的劃分邏輯層。而前一個攔截器可以根據實際的處理情況來決定下一攔截器是否應該繼續處理。

(4)RealInterceptorChain.proceed()

RealInterceptorChain.java
public Response proceed(Request request, Transmitter transmitter, @Nullable Exchange exchange)
throws IOException {
if (index >= interceptors.size()) throw new AssertionError();
calls++;
...
/**
* index+1:構建出新的攔截鏈,不過新的攔截鏈的處理攔截器是下標為index+1的
* 實現了責任鏈中,處理邏輯的流轉。
*/
RealInterceptorChain next = new RealInterceptorChain(interceptors, transmitter, exchange,
index + 1, request, call, connectTimeout, readTimeout, writeTimeout);
//此時index = 0;所以拿到了第一個攔截器,并且調用他的intercept 方法進行具體邏輯處理。
Interceptor interceptor = interceptors.get(index);
//當前攔截器對網絡請求進行處理。
Response response = interceptor.intercept(next);
// Confirm that the next interceptor made its required call to chain.proceed().
if (exchange != null && index + 1 < interceptors.size() && next.calls != 1) {
throw new IllegalStateException("network interceptor " + interceptor
+ " must call proceed() exactly once");
}
// 省略對response合法性的檢查代碼
...
return response;
}

  •  先index+1,構建index指向下一個攔截器的責任鏈。
  • 在鏈中取出下標當前index(此時為0)的攔截器,并調用intercept(next)進行此次攔截器邏輯的真正處理。這里注意,傳遞進去的參數正是1中構建出來的next責任鏈。
  • 在Interceptor.intercept()方法內部進行自身的邏輯處理以后,會調用next.proceed()進行一次傳遞,由下一個攔截器進行處理。而此次請求也是這樣在各個攔截器中被 處理->傳遞->處理->...->返回結果。

4、異步和同步總結

同步

  • RealCall.execute() ?? Dispatcher.execute() ---runningSyncCalls(異步請求執行隊列)添加 call 對象。
  • getResponseWithInterceptorChain() 返回 Response 對象。
  • Dispatcher.finished()。

異步

  • RealCall. enqueue() ?? Dispatcher. enqueue()---readyAsyncCalls(異步請求就緒隊列)添加 call 對象。
  •  readyAsyncCalls(異步請求就緒隊列),將滿足條件的添加到臨時隊列和runningAsyncCalls (異步請求的執行隊列)。
  • getResponseWithInterceptorChain() 返回 Response 對象;。
  • Dispatcher.finished()。
責任編輯:姜華 來源: Android開發編程
相關推薦

2021-03-10 08:20:54

設計模式OkHttp

2022-01-04 20:52:50

函數異步Promise

2018-01-30 18:15:12

Python網絡爬蟲gevent

2022-06-13 06:20:42

setStatereact18

2021-11-09 09:30:52

OkHttp面試Android

2025-10-15 02:11:00

2020-09-24 08:45:10

React架構源碼

2013-03-08 09:33:25

JavaScript同步異步

2024-07-26 21:55:39

RustRESTfulAPI

2022-08-14 07:14:50

Kafka零拷貝

2025-06-30 00:01:00

Node.js?Go線程

2020-11-10 13:52:19

TCPRST攻擊IP

2022-09-06 11:13:16

接口PipelineHandler

2022-09-23 11:00:27

KafkaZookeeper機制

2020-09-07 11:14:02

Vue異步更新

2020-09-25 18:10:06

Python 開發編程語言

2023-09-07 08:15:58

場景同步異步

2024-10-09 11:31:51

2024-07-11 16:49:43

同步通信異步通信通信

2023-05-18 08:54:22

OkHttp源碼解析
點贊
收藏

51CTO技術棧公眾號

午夜精品999| 麻豆视频在线观看免费网站| 一区在线视频观看| 69成人精品免费视频| 一区二区在线观看网站| 97精品人妻一区二区三区香蕉| 国产成人手机高清在线观看网站| 日韩欧美一区二区三区| 日本一区二区不卡高清更新| 波多野结衣午夜| 日本午夜一区| 91精品久久久久久久99蜜桃| a级黄色片免费| 黄色一级大片在线免费看国产| 最新日韩欧美| 亚洲欧美视频在线| 国产精品视频分类| 性网站在线观看| 97超碰欧美中文字幕| 国产成人激情视频| caoporn91| 麻豆精品少妇| 欧美日韩久久不卡| 91黄色在线看| 丁香婷婷在线| 国产99精品在线观看| 欧美在线激情网| 2017亚洲天堂| 精品国产亚洲一区二区三区| 日韩欧美aⅴ综合网站发布| 亚洲精品9999| 男人天堂av网| 久久国产福利| 色在人av网站天堂精品| 三上悠亚影音先锋| 综合久久伊人| 一本大道久久a久久综合 | 日韩中文字幕| 色综合久久久久网| 国产精品久久久久久久乖乖| 91精彩在线视频| www.成人网.com| 91精品啪aⅴ在线观看国产| 日韩人妻无码一区二区三区99| 欧美美乳视频| 精品成人免费观看| 国产成人在线综合| 精品91久久| 亚洲一区二区三区影院| 亚洲午夜精品一区二区| 日本国产在线| av一区二区三区四区| 成人看片人aa| 久久久久久无码精品大片| 激情综合中文娱乐网| 久久精彩免费视频| 欧美激情视频二区| 亚洲男人都懂第一日本| 欧美成人福利视频| av电影中文字幕| 影音先锋欧美激情| 精品av久久707| 性活交片大全免费看| 国产欧美啪啪| 亚洲精品理论电影| 国产伦精品一区二区三区妓女| 极品国产人妖chinesets亚洲人妖| 精品国精品自拍自在线| youjizz.com日本| 加勒比中文字幕精品| 日韩av在线一区二区| 深爱五月激情网| 欧美精品一区二区三区精品| 中文字幕日韩视频| 欧美人禽zoz0强交| 亚洲黄网站黄| 国产成人拍精品视频午夜网站| 中文字幕av第一页| 国产一区二区美女| 俄罗斯精品一区二区三区| 黄色a在线观看| 26uuu欧美| 日韩资源av在线| 黄色网址在线免费| 亚洲成人av中文| 日韩精品无码一区二区三区免费 | 一本一道久久a久久精品| 成人精品视频一区二区| 一区二区三区日本视频| 日韩亚洲欧美成人一区| 国产人妻人伦精品1国产丝袜| 国产91精品对白在线播放| 日韩一区二区三区国产| 国产一级视频在线观看| 日韩精品一级中文字幕精品视频免费观看| 国产精品视频在线观看| 国产不卡精品视频| 91色视频在线| 国产一区一区三区| 国产免费不卡| 日韩一区二区精品葵司在线| 9.1成人看片免费版| 亚洲深深色噜噜狠狠爱网站| 91精品国产91久久久久久最新| 乱子伦一区二区三区| 国产黑丝在线一区二区三区| 日韩免费中文专区| 丁香高清在线观看完整电影视频| 91国产成人在线| 任你躁av一区二区三区| 成人羞羞在线观看网站| 国内精品免费午夜毛片| 在线视频 91| 91香蕉国产在线观看软件| 日本丰满大乳奶| 日韩av电影资源网| 亚洲国产欧美在线成人app| 免费黄色国产视频| 日韩专区在线视频| 精品国产日本| 日本在线视频网址| 在线不卡的av| 欧美性受xxxx黑人| 久久激情一区| 精品欧美日韩在线| 日本孕妇大胆孕交无码| 8v天堂国产在线一区二区| 国产高清一区二区三区四区| 一本一本久久| 99在线首页视频| 国产黄a三级三级三级av在线看| 91久久线看在观草草青青| 中文字幕a在线观看| 午夜国产精品视频| 亚洲iv一区二区三区| sese一区| 欧美午夜影院一区| www.av天天| 久久男女视频| 蜜桃在线一区二区三区精品| 国产伦理精品| 亚洲成人黄色在线观看| 麻豆国产尤物av尤物在线观看| 精品在线免费视频| 一本色道久久综合亚洲精品婷婷| 欧洲精品一区二区三区| 亚洲性日韩精品一区二区| 二区视频在线观看| 2024国产精品| 欧美日韩在线中文| 少妇精品久久久| 国产成人在线亚洲欧美| 大片免费播放在线视频| 精品视频一区三区九区| а天堂中文在线资源| 蜜臀av性久久久久蜜臀aⅴ流畅| 日本一区二区不卡高清更新| a屁视频一区二区三区四区| 中文字幕日韩电影| 国产一区二区在线视频聊天| 日韩美女视频一区二区| avtt中文字幕| 99精品视频网| 欧美日韩喷水| 精品福利在线| 久久99精品国产99久久6尤物| 成人av一区二区三区在线观看| 亚洲欧美偷拍卡通变态| 亚洲妇女无套内射精| 激情欧美日韩一区| 久久久久成人精品免费播放动漫| 午夜久久中文| 一区二区三区亚洲| 国产视频在线观看视频| 亚洲综合在线第一页| 屁屁影院国产第一页| 美女诱惑一区| 成年人免费观看的视频| 成人福利免费在线观看| 欧洲一区二区视频| 久久99精品久久| 亚洲国产精品悠悠久久琪琪| 日本黄色一级视频| 亚洲女女做受ⅹxx高潮| 中文字幕在线播放一区| 久久一区中文字幕| 中文字幕在线观看一区二区三区| 日韩欧美中文字幕一区二区三区| 97在线精品国自产拍中文| h视频在线观看免费| 日韩小视频在线观看专区| www.国产色| 亚洲男人的天堂网| 欧美bbbbb性bbbbb视频| 久久精品99久久久| 激情深爱综合网| 三级电影一区| 久久影视中文粉嫩av| 国产精品视频一区二区三区综合 | 精品欧美一区二区三区在线观看 | 久久久久免费看黄a片app| 国产乱码精品一区二区亚洲 | 国产wwwwwww| 日本久久电影网| 久草视频免费在线| 国产精品三级视频| 中文字幕日韩三级片| 极品美女销魂一区二区三区免费| 日本a在线免费观看| 日韩三级在线| 欧美极品色图| 久久精品福利| 亚洲va码欧洲m码| 欧美色网在线| 91超碰caoporn97人人| www视频在线免费观看| 永久免费看mv网站入口亚洲| 黄色福利在线观看| 欧美精品自拍偷拍动漫精品| 无码人妻av免费一区二区三区| 亚洲一区二区在线视频| 亚洲色图27p| 国产蜜臀97一区二区三区| 亚洲中文字幕无码一区| 国产乱人伦偷精品视频免下载| 久久精品免费网站| 老司机一区二区三区| av高清在线免费观看| 91精品成人| 亚洲看片网站| 国产一区二区三区探花| 免费在线观看91| 久久aimee| 成人欧美一区二区三区黑人免费| 日本午夜精品久久久久| 国产精品成人aaaaa网站| 吉吉日韩欧美| 日本免费久久高清视频| 久草免费在线视频| 久久免费精品视频| 欧美大片黄色| 欧美激情在线观看视频| 在线电影福利片| 久久久精品网站| 黄色网址在线免费播放| 久久久国产成人精品| 黄网站免费在线播放| 伊人精品在线观看| 国产片在线观看| 国产一区二区精品丝袜| 国产露出视频在线观看| 亚洲网站视频福利| av在线电影免费观看| 国产亚洲人成a一在线v站| 国产乱理伦片a级在线观看| 尤物九九久久国产精品的特点| 国产一级在线观看| 中文字幕免费国产精品| 欧美jizzhd69巨大| 久久成人人人人精品欧| 羞羞的视频在线看| 国外成人在线视频| 第84页国产精品| 国产精品美女久久久久av超清| 欧美激情福利| 波多野结衣精品久久| 欧美freesex8一10精品| 欧美日韩在线精品一区二区三区| 成人激情视频| 日韩精品福利片午夜免费观看| 午夜精品婷婷| 日韩中文字幕在线视频观看 | 午夜av中文字幕| 国产suv精品一区二区三区| 日本三级日本三级日本三级极| 久久奇米777| 日韩一卡二卡在线观看| 亚洲一区二区三区四区的| 国产精品视频免费播放| 欧美视频精品在线观看| 国产xxxx在线观看| 日韩电影免费观看中文字幕 | 亚洲国产高清aⅴ视频| 97在线观看视频免费| 亚洲成人在线观看视频| 欧美日韩a v| 日韩午夜小视频| 国产综合视频一区二区三区免费| 日韩中文在线中文网三级| 电影k8一区二区三区久久| 国产成人av网| 亚洲成av人片在线观看www| 欧美男人的天堂| 欧美69视频| 青青在线视频免费| 国产激情一区二区三区四区 | 狠狠色香婷婷久久亚洲精品| 在线不卡免费视频| 亚洲成成品网站| 天堂а√在线官网| 5252色成人免费视频| 国产精选久久| 色一情一区二区三区四区| 亚洲国产导航| 91亚洲一区二区| 中文字幕欧美日韩一区| 日本三级中文字幕| 欧美精品在线视频| 黄色大片在线免费观看| 久久久久久久久久久网站| 欧美aaaaaaaa| 欧洲在线视频一区| 1024日韩| 91福利视频免费观看| 国产欧美日产一区| 国产成人在线观看网站| 欧美一区二区三区男人的天堂| 国产午夜在线视频| 2023亚洲男人天堂| 高清精品xnxxcom| 黄色www在线观看| 免费成人在线影院| 一区二区三区伦理片| 亚洲成av人片一区二区梦乃 | 日韩电影中文 亚洲精品乱码 | 热门国产精品亚洲第一区在线| 日韩一区二区三区色| 中文字幕色一区二区| 美女一区二区久久| 在线观看日本黄色| 日本道在线观看一区二区| 亚洲AV第二区国产精品| 欧美激情亚洲激情| 99re8这里有精品热视频免费| 手机看片日韩国产| 免费成人在线视频观看| 国产不卡123| 精品国产一区二区亚洲人成毛片| 天天影视久久综合| 国产精品美女www爽爽爽视频| 嫩草一区二区三区| 欧美v在线观看| 91在线国产观看| 久久国产精品免费看| 亚洲第一页自拍| 3344国产永久在线观看视频| www 成人av com| 韩国欧美一区| 岛国精品一区二区三区| 夜夜嗨av一区二区三区中文字幕 | www.九色在线| 精品国产一区二区三区四区精华 | 免费看av毛片| 欧美激情亚洲综合一区| 国产精品99久久免费观看| 很污的网站在线观看| 成人精品在线视频观看| 亚洲精品午夜久久久久久久| 日韩成人在线电影网| 日本不良网站在线观看| 欧美激情论坛| 免费在线看成人av| www.av成人| 精品乱人伦一区二区三区| 丁香花在线高清完整版视频| 久久96国产精品久久99软件| 国产日韩欧美三区| 日韩av在线看免费观看| 欧美午夜电影一区| 成人在线观看免费网站| 国产66精品久久久久999小说| 亚洲经典在线看| 在线视频第一页| 91精品国产日韩91久久久久久| 色操视频在线| 农村寡妇一区二区三区| 另类调教123区 | 91高清视频免费看| 午夜视频在线免费观看| 91av免费看| 久久精品导航| 男女做暖暖视频| 亚洲精品国精品久久99热 | 欧美一区二区三区啪啪| 草草在线视频| 亚洲欧美日韩另类精品一区二区三区| 国产一区欧美一区| 亚洲另类欧美日韩| 久久久av电影| 色天天色综合| 国产欧美一区二| 疯狂做受xxxx高潮欧美日本| a天堂中文在线88| 国产精品制服诱惑| 免费在线视频一区| 在线看成人av| 精品国产一区二区三区久久久狼| 国产伦理久久久久久妇女 | 久久精品亚洲一区| 欧美日韩看看2015永久免费 |