久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

解析Android框架之OkHttp3源碼

瀏覽:7日期:2022-09-18 10:56:39
目錄OkHttp流程圖OkHttp基本使用OkHttp源碼分析OkHttp流程圖

解析Android框架之OkHttp3源碼

OkHttp基本使用

gradle依賴

implementation ’com.squareup.okhttp3:okhttp:3.11.0’

implementation ’com.squareup.okio:okio:1.15.0’

/** *這里拿get請求來 * 異步的get請求 */ public void okhttpAsyn() {//設置超時的時間OkHttpClient.Builder builder = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS);OkHttpClient okHttpClient = builder.build();Request request = new Request.Builder().get() //設置請求模式.url('https://www.baidu.com/').build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) {Log.d('MainActivity', '-----------onFailure-----------'); } @Override public void onResponse(Call call, Response response) throws IOException {Log.d('MainActivity', '----onResponse----' + response.body().toString());runOnUiThread(new Runnable() { @Override public void run() {Toast.makeText(MainActivity.this, '請求成功', Toast.LENGTH_LONG).show(); }}); }}); }OkHttp源碼分析

從OkHttp的基本使用中,我們看到,通過okHttpClient.newCall()方法,拿到這個call對象,我們看看newCall是怎么走的

/** * Prepares the {@code request} to be executed at some point in the future. */ @Override public Call newCall(Request request) { return RealCall.newRealCall(this, request, false /* for web socket */); } static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) { // Safely publish the Call instance to the EventListener. RealCall call = new RealCall(client, originalRequest, forWebSocket); call.eventListener = client.eventListenerFactory().create(call); return call; }

從這里的源碼知道,okHttpClient.newCall()實際上返回的是RealCall對象,而call.enqueue(),實際上是調用的了RealCall中的enqueue()方法,我們看看enqueue()方法方法怎么走。

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

可以看到client.dispatcher().enqueue(new AsyncCall(responseCallback));這句代碼,也就是說,最終是有的請求是有dispatcher來完成,我們看看dispatcher。

/* * Copyright (C) 2013 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package okhttp3;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Collections;import java.util.Deque;import java.util.Iterator;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import javax.annotation.Nullable;import okhttp3.RealCall.AsyncCall;import okhttp3.internal.Util;/** * Policy on when async requests are executed. * * <p>Each dispatcher uses an {@link ExecutorService} to run calls internally. If you supply your * own executor, it should be able to run {@linkplain #getMaxRequests the configured maximum} number * of calls concurrently. */public final class Dispatcher { //最大請求的并發(fā)數(shù) private int maxRequests = 64; //每個主機最大請求數(shù) private int maxRequestsPerHost = 5; private @Nullable Runnable idleCallback; /** 消費線程池 */ private @Nullable ExecutorService executorService; /** 準備運行的異步請求隊列 */ private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>(); /** 正在運行的異步請求隊列 */ private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>(); /** 正在運行的同步請求隊列 */ private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>(); /** 構造方法 */ public Dispatcher(ExecutorService executorService) { this.executorService = executorService; } public Dispatcher() { } public synchronized ExecutorService executorService() { if (executorService == null) { executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), Util.threadFactory('OkHttp Dispatcher', false)); } return executorService; } /** * *設置并發(fā)執(zhí)行最大的請求數(shù)量 * <p>If more than {@code maxRequests} requests are in flight when this is invoked, those requests * will remain in flight. */ public synchronized void setMaxRequests(int maxRequests) { if (maxRequests < 1) { throw new IllegalArgumentException('max < 1: ' + maxRequests); } this.maxRequests = maxRequests; promoteCalls(); } //獲取到最大請求的數(shù)量 public synchronized int getMaxRequests() { return maxRequests; } /** * 設置每個主機并發(fā)執(zhí)行的請求的最大數(shù)量 * <p>If more than {@code maxRequestsPerHost} requests are in flight when this is invoked, those * requests will remain in flight. * * <p>WebSocket connections to hosts <b>do not</b> count against this limit. */ public synchronized void setMaxRequestsPerHost(int maxRequestsPerHost) { if (maxRequestsPerHost < 1) { throw new IllegalArgumentException('max < 1: ' + maxRequestsPerHost); } this.maxRequestsPerHost = maxRequestsPerHost; promoteCalls(); } //獲取每個主機最大并發(fā)數(shù)量 public synchronized int getMaxRequestsPerHost() { return maxRequestsPerHost; } /** * Set a callback to be invoked each time the dispatcher becomes idle (when the number of running * calls returns to zero). * * <p>Note: The time at which a {@linkplain Call call} is considered idle is different depending * on whether it was run {@linkplain Call#enqueue(Callback) asynchronously} or * {@linkplain Call#execute() synchronously}. Asynchronous calls become idle after the * {@link Callback#onResponse onResponse} or {@link Callback#onFailure onFailure} callback has * returned. Synchronous calls become idle once {@link Call#execute() execute()} returns. This * means that if you are doing synchronous calls the network layer will not truly be idle until * every returned {@link Response} has been closed. */ public synchronized void setIdleCallback(@Nullable Runnable idleCallback) { this.idleCallback = idleCallback; } synchronized void enqueue(AsyncCall call) { if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) { runningAsyncCalls.add(call); executorService().execute(call); } else { readyAsyncCalls.add(call); } } /** * Cancel all calls currently enqueued or executing. Includes calls executed both {@linkplain * Call#execute() synchronously} and {@linkplain Call#enqueue asynchronously}. */ public synchronized void cancelAll() { for (AsyncCall call : readyAsyncCalls) { call.get().cancel(); } for (AsyncCall call : runningAsyncCalls) { call.get().cancel(); } for (RealCall call : runningSyncCalls) { call.cancel(); } } private void promoteCalls() { if (runningAsyncCalls.size() >= maxRequests) return; // Already running max capacity. if (readyAsyncCalls.isEmpty()) return; // No ready calls to promote. for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) { AsyncCall call = i.next(); if (runningCallsForHost(call) < maxRequestsPerHost) {i.remove();runningAsyncCalls.add(call);executorService().execute(call); } if (runningAsyncCalls.size() >= maxRequests) return; // Reached max capacity. } } //----------------省略若干代碼-----------------------}

我們來找到這段代碼

synchronized void enqueue(AsyncCall call) { if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) { runningAsyncCalls.add(call); executorService().execute(call); } else { readyAsyncCalls.add(call); } }

當正在運行的異步請求隊列中的數(shù)量小于64并且正在運行的請求主機數(shù)小于5時則把請求加載到runningAsyncCalls中并在線程池中執(zhí)行,否則就再入到readyAsyncCalls中進行緩存等待。而runningAsyncCalls這個請求隊列存放的就是AsyncCall對象,而這個AsyncCall就是RealCall的內部類,也就是說executorService().execute(call);實際上走的是RealCall類中的execute()方法.

@Override protected void execute() { boolean signalledCallback = false; try {Response response = getResponseWithInterceptorChain();if (retryAndFollowUpInterceptor.isCanceled()) { signalledCallback = true; responseCallback.onFailure(RealCall.this, new IOException('Canceled'));} else { signalledCallback = true; responseCallback.onResponse(RealCall.this, response);} } catch (IOException e) {if (signalledCallback) { // Do not signal the callback twice! Platform.get().log(INFO, 'Callback failure for ' + toLoggableString(), e);} else { eventListener.callFailed(RealCall.this, e); responseCallback.onFailure(RealCall.this, e);} } finally {client.dispatcher().finished(this); } }

這部分的代碼,相信很多人都能夠看的明白,無非就是一些成功,失敗的回調,這段代碼,最重要的是esponse response = getResponseWithInterceptorChain();和client.dispatcher().finished(this);我們先來看看client.dispatcher().finished(this);這句代碼是怎么執(zhí)行的。

/** Used by {@code AsyncCall#run} to signal completion. */ void finished(AsyncCall call) { finished(runningAsyncCalls, call, true); } /** Used by {@code Call#execute} to signal completion. */ void finished(RealCall call) { finished(runningSyncCalls, call, false); } private <T> void finished(Deque<T> calls, T call, boolean promoteCalls) { int runningCallsCount; Runnable idleCallback; synchronized (this) { if (!calls.remove(call)) throw new AssertionError('Call wasn’t in-flight!'); if (promoteCalls) promoteCalls(); runningCallsCount = runningCallsCount(); idleCallback = this.idleCallback; } if (runningCallsCount == 0 && idleCallback != null) { idleCallback.run(); } }private void promoteCalls() { if (runningAsyncCalls.size() >= maxRequests) return; // Already running max capacity. if (readyAsyncCalls.isEmpty()) return; // No ready calls to promote. for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) { AsyncCall call = i.next(); if (runningCallsForHost(call) < maxRequestsPerHost) {i.remove();runningAsyncCalls.add(call);executorService().execute(call); } if (runningAsyncCalls.size() >= maxRequests) return; // Reached max capacity. } }

由于client.dispatcher().finished(this);這句代碼是放到finally中執(zhí)行的,所以無論什么情況,都會執(zhí)行上面的promoteCalls()方法,而從promoteCalls()方法中可以看出通過遍歷來獲取到下一個請求從而執(zhí)行下一個網絡請求。

回過頭來,我們看看這一句代碼Response response = getResponseWithInterceptorChain(); 通過getResponseWithInterceptorChain();來獲取到response,然后回調返回。很明顯getResponseWithInterceptorChain()這句代碼里面進行了網絡請求。我們看看是怎么執(zhí)行的。

Response getResponseWithInterceptorChain() throws IOException { // Build a full stack of interceptors. List<Interceptor> interceptors = new ArrayList<>(); interceptors.addAll(client.interceptors()); interceptors.add(retryAndFollowUpInterceptor); interceptors.add(new BridgeInterceptor(client.cookieJar())); interceptors.add(new CacheInterceptor(client.internalCache())); interceptors.add(new ConnectInterceptor(client)); if (!forWebSocket) { interceptors.addAll(client.networkInterceptors()); } interceptors.add(new CallServerInterceptor(forWebSocket)); Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,originalRequest, this, eventListener, client.connectTimeoutMillis(),client.readTimeoutMillis(), client.writeTimeoutMillis()); return chain.proceed(originalRequest); }}

從上面代碼可以知道,緩存,網絡請求,都封裝成攔截器的形式。攔截器主要用來觀察,修改以及可能短路的請求輸出和響應的回來。最后return chain.proceed,而chain是通過new RealInterceptorChain來獲取到的,我們來看看RealInterceptorChain對象,然后找到proceed()方法。

public Response proceed(Request request, StreamAllocation streamAllocation, HttpCodec httpCodec, RealConnection connection) throws IOException { if (index >= interceptors.size()) throw new AssertionError(); calls++; // If we already have a stream, confirm that the incoming request will use it. if (this.httpCodec != null && !this.connection.supportsUrl(request.url())) { throw new IllegalStateException('network interceptor ' + interceptors.get(index - 1) + ' must retain the same host and port'); } // If we already have a stream, confirm that this is the only call to chain.proceed(). if (this.httpCodec != null && calls > 1) { throw new IllegalStateException('network interceptor ' + interceptors.get(index - 1) + ' must call proceed() exactly once'); } // 調用下一個攔截器 RealInterceptorChain next = new RealInterceptorChain(interceptors, streamAllocation, httpCodec,connection, index + 1, request, call, eventListener, connectTimeout, readTimeout,writeTimeout); Interceptor interceptor = interceptors.get(index); Response response = interceptor.intercept(next); //調用攔截器中的intercept()方法 // Confirm that the next interceptor made its required call to chain.proceed(). if (httpCodec != null && index + 1 < interceptors.size() && next.calls != 1) { throw new IllegalStateException('network interceptor ' + interceptor + ' must call proceed() exactly once'); } // Confirm that the intercepted response isn’t null. if (response == null) { throw new NullPointerException('interceptor ' + interceptor + ' returned null'); } if (response.body() == null) { throw new IllegalStateException( 'interceptor ' + interceptor + ' returned a response with no body'); } return response; }

從上面的代碼可以看出來,chain.proceed主要是講集合中的攔截器遍歷出來,然后通過調用每一個攔截器中的intercept()方法,然后獲取到response結果,返回。

我們看看CacheInterceptor這個類,找到intercept()方法。

@Override public Response intercept(Chain chain) throws IOException { Response cacheCandidate = cache != null? cache.get(chain.request()): null; long now = System.currentTimeMillis(); //創(chuàng)建CacheStrategy.Factory對象,進行緩存配置 CacheStrategy strategy = new CacheStrategy.Factory(now, chain.request(), cacheCandidate).get(); //網絡請求 Request networkRequest = strategy.networkRequest; //緩存響應 Response cacheResponse = strategy.cacheResponse; if (cache != null) { //記錄當前請求是網絡發(fā)起還是緩存發(fā)起 cache.trackResponse(strategy); } if (cacheCandidate != null && cacheResponse == null) { closeQuietly(cacheCandidate.body()); // The cache candidate wasn’t applicable. Close it. } // 不進行網絡請求并且緩存不存在或者過期則返回504錯誤 if (networkRequest == null && cacheResponse == null) { return new Response.Builder() .request(chain.request()) .protocol(Protocol.HTTP_1_1) .code(504) .message('Unsatisfiable Request (only-if-cached)') .body(Util.EMPTY_RESPONSE) .sentRequestAtMillis(-1L) .receivedResponseAtMillis(System.currentTimeMillis()) .build(); } // 不進行網絡請求,而且緩存可以使用,直接返回緩存 if (networkRequest == null) { return cacheResponse.newBuilder() .cacheResponse(stripBody(cacheResponse)) .build(); } //進行網絡請求 Response networkResponse = null; try { networkResponse = chain.proceed(networkRequest); } finally { // If we’re crashing on I/O or otherwise, don’t leak the cache body. if (networkResponse == null && cacheCandidate != null) {closeQuietly(cacheCandidate.body()); } } //---------省略若干代碼------------- return response; }

上面我做了很多注釋,基本的流程是有緩存就取緩存里面的,沒有緩存就請求網絡。我們來看看網絡請求的類CallServerInterceptor

/* * Copyright (C) 2016 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package okhttp3.internal.http;import java.io.IOException;import java.net.ProtocolException;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;import okhttp3.internal.Util;import okhttp3.internal.connection.RealConnection;import okhttp3.internal.connection.StreamAllocation;import okio.Buffer;import okio.BufferedSink;import okio.ForwardingSink;import okio.Okio;import okio.Sink;/** This is the last interceptor in the chain. It makes a network call to the server. */public final class CallServerInterceptor implements Interceptor { private final boolean forWebSocket; public CallServerInterceptor(boolean forWebSocket) { this.forWebSocket = forWebSocket; } @Override public Response intercept(Chain chain) throws IOException { RealInterceptorChain realChain = (RealInterceptorChain) chain; HttpCodec httpCodec = realChain.httpStream(); StreamAllocation streamAllocation = realChain.streamAllocation(); RealConnection connection = (RealConnection) realChain.connection(); Request request = realChain.request(); long sentRequestMillis = System.currentTimeMillis(); realChain.eventListener().requestHeadersStart(realChain.call()); httpCodec.writeRequestHeaders(request); realChain.eventListener().requestHeadersEnd(realChain.call(), request); Response.Builder responseBuilder = null; if (HttpMethod.permitsRequestBody(request.method()) && request.body() != null) { // If there’s a 'Expect: 100-continue' header on the request, wait for a 'HTTP/1.1 100 // Continue' response before transmitting the request body. If we don’t get that, return // what we did get (such as a 4xx response) without ever transmitting the request body. if ('100-continue'.equalsIgnoreCase(request.header('Expect'))) {httpCodec.flushRequest();realChain.eventListener().responseHeadersStart(realChain.call());responseBuilder = httpCodec.readResponseHeaders(true); } if (responseBuilder == null) {// Write the request body if the 'Expect: 100-continue' expectation was met.realChain.eventListener().requestBodyStart(realChain.call());long contentLength = request.body().contentLength();CountingSink requestBodyOut = new CountingSink(httpCodec.createRequestBody(request, contentLength));BufferedSink bufferedRequestBody = Okio.buffer(requestBodyOut);request.body().writeTo(bufferedRequestBody);bufferedRequestBody.close();realChain.eventListener() .requestBodyEnd(realChain.call(), requestBodyOut.successfulCount); } else if (!connection.isMultiplexed()) {// If the 'Expect: 100-continue' expectation wasn’t met, prevent the HTTP/1 connection// from being reused. Otherwise we’re still obligated to transmit the request body to// leave the connection in a consistent state.streamAllocation.noNewStreams(); } } httpCodec.finishRequest(); if (responseBuilder == null) { realChain.eventListener().responseHeadersStart(realChain.call()); responseBuilder = httpCodec.readResponseHeaders(false); } Response response = responseBuilder.request(request).handshake(streamAllocation.connection().handshake()).sentRequestAtMillis(sentRequestMillis).receivedResponseAtMillis(System.currentTimeMillis()).build(); int code = response.code(); if (code == 100) { // server sent a 100-continue even though we did not request one. // try again to read the actual response responseBuilder = httpCodec.readResponseHeaders(false); response = responseBuilder .request(request) .handshake(streamAllocation.connection().handshake()) .sentRequestAtMillis(sentRequestMillis) .receivedResponseAtMillis(System.currentTimeMillis()) .build(); code = response.code(); } realChain.eventListener() .responseHeadersEnd(realChain.call(), response); if (forWebSocket && code == 101) { // Connection is upgrading, but we need to ensure interceptors see a non-null response body. response = response.newBuilder() .body(Util.EMPTY_RESPONSE) .build(); } else { response = response.newBuilder() .body(httpCodec.openResponseBody(response)) .build(); } if ('close'.equalsIgnoreCase(response.request().header('Connection'))|| 'close'.equalsIgnoreCase(response.header('Connection'))) { streamAllocation.noNewStreams(); } if ((code == 204 || code == 205) && response.body().contentLength() > 0) { throw new ProtocolException( 'HTTP ' + code + ' had non-zero Content-Length: ' + response.body().contentLength()); } return response; }}

到這里,基本上okhttp的整個流程就出來了,當然,這里只是一個整體的大概流程,如果要摳的很細,那就不是一篇文章能夠說明的了了。現(xiàn)在回過頭來再看一眼流程圖,是不是感覺特別明朗了。

以上就是解析Android框架之OkHttp3源碼的詳細內容,更多關于Android框架之OkHttp3源碼的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 日韩欧美一区在线 | 一区二区在线视频免费观看 | 日韩中文一区二区三区 | 99色播| 在线精品亚洲 | 欧美在线播放 | 一区二区在线免费观看 | 久久91精品国产91久久跳 | 午夜精品视频在线观看 | 午夜影视av| 亚洲毛片在线观看 | 男女免费视频 | 精品国产一区二区三区久久久蜜 | 九九99久久 | 成人国产精品一级毛片视频 | 亚洲欧美日韩在线一区二区三区 | 成人免费共享视频 | 91精品国产乱码久久久久久 | 国产精品成人3p一区二区三区 | 色综合久久天天综合网 | a免费在线观看 | 亚洲电影在线观看 | 精品久久久久久久久久 | 99久久精品免费看国产免费软件 | 欧美成人高清视频 | 日韩久久久 | 中文字字幕在线 | 国产欧美日韩在线观看 | 精品自拍视频 | 看一级黄色大片 | 亚洲精品乱码久久久久久蜜桃不爽 | 日韩不卡一区二区三区 | 看毛片的网站 | 搜索黄色毛片 | 欧美一级免费看 | 久久99精品国产91久久来源 | 精精国产 | 免费看国产片在线观看 | 女男羞羞视频网站免费 | 欧美日本亚洲 | 国产精品中文 | 久久久久黄色 | 91久久久久久久久 | 亚洲一区二区三区高清 | 中文字幕高清视频 | 在线播放亚洲 | 美女午夜影院 | 在线 亚洲 欧美 | 日韩小视频 | 国产精品久久九九 | 欧美日韩亚洲国产综合 | 欧美一区二区在线免费观看 | 美女扒开尿口来摸 | 国产一区二区在线电影 | 久久久国产精品 | 午夜爱爱毛片xxxx视频免费看 | 国产成人高清 | 国产成人精品综合 | 91精品国产自产精品男人的天堂 | 成人免费在线看片 | 97精品视频在线 | 国产精品国产精品国产专区不片 | 欧美三级电影在线播放 | 91文字幕巨乱亚洲香蕉 | 久久国产一 | 国产精品久久久久一区二区三区 | 四色成人av永久网址 | 成人国产一区二区 | 国产成人精品久久久 | 亚洲视频 欧美视频 | 综合精品 | 极情综合网 | 日韩中文在线 | 午夜精品一区二区三区在线视频 | 国产成人福利在线 | 91精品久久久久久 | 国产一极毛片 | 日韩精品视频免费专区在线播放 | 日日射天天干 | 久草青青 | 在线观看中文 | 韩国精品主播一区二区在线观看 | 日韩免费高清在线 | 久草视频首页 | 成人在线看片 | 国产精品99久久久久久www | 亚洲国产一区二区三区 | 黄色毛片看看 | 在线看一区 | 亚洲国产区| 成人亚洲网站 | 国产三级在线播放 | 国产成人精品一区二区三区视频 | 国产精品久久久久久一区二区三区 | 国产精品一区二区三区四区 | 国产在线一区二区三区 | 99精品电影 | 爱爱视频免费 | 国产成人在线一区二区 | 久久久99精品免费观看 | 超碰天天 | 欧美国产日韩在线 | 成人深夜在线观看 | 黄色国产一级视频 | 中国电影黄色一级片免费观看 | 精品久久久久久亚洲精品 | 亚洲97 | 日韩一本 | 在线观看欧美一区 | 久久久久久久国产 | 一级片av | 午夜影院毛片 | 五月婷综合 | 夜夜av | 在线视频91| 亚洲欧美另类久久久精品2019 | 精品亚洲一区二区三区 | 九九精品视频在线观看 | 色狠狠一区 | 久久久久国产 | 麻豆精品国产传媒 | 九色视频网站 | 久久精品手机视频 | а天堂中文最新一区二区三区 | 中文字幕在线观看亚洲 | 在线一区二区免费 | 久久天堂 | 视频在线一区 | 亚洲激情第一页 | 亚洲成人一区二区三区 | 久久国产区| hd国产人妖ts另类视频 | 国产a视频 | 九九免费视频 | 欧美一级毛片免费看 | 天天拍天天干天天操 | 精品少妇一区二区 | 中文字幕免费视频观看 | 99热免费在线| 视频一区二区三区在线播放 | 精品国产一区在线 | 一级a性色生活片久久毛片波多野 | 国产日韩精品视频 | 亚洲欧美一级 | 污视频免费网站观看 | 国产成人久久精品一区二区三区 | 操操操av | 观看av | 国产第一区二区三区 | 国产在线一区二区三区 | 日韩精品一二三区 | 午夜精品网站 | 91精品国产乱码久久久久久 | 国产男女爽爽爽免费视频 | 国产99精品在线 | 美女网站视频免费黄 | 毛片久久久 | 久久亚洲视频 | 欧美一区在线视频 | 亚洲国产精品精华液com | 欧美久久久久 | 精品亚洲一区二区三区四区五区 | 一区二区亚洲 | 狠狠综合久久av一区二区老牛 | 日韩精品一区二区三区在线观看 | 中文字幕亚洲在线 | 成人午夜毛片 | 久久久久久久国产 | 色综合久久久久久久久久久 | 精品日韩欧美 | 精品九九九| 中文字幕一区在线观看 | 美女久久 | 亚洲精品美女久久 | 精品视频一区二区在线观看 | 久久丁香 | 欧美 日韩 国产 一区 | 国产成人久久精品77777 | 久久精品一区二区三区中文字幕 | 久久人人爽人人爽人人片av软件 | 欧美日韩一区在线观看 | 国产精品一区二区三区在线播放 | 国产精品视频久久 | 欧美喷潮久久久xxxxx | 91精品国产综合久久精品 | 久久久久无码国产精品一区 | 日本免费在线 | 免费成人精品 | 毛片入口 | 伊人草 | 国产精品久久久久久久久久 | 成人精品视频99在线观看免费 | 精品一区二区三区视频 | 91国产精品 | 亚洲精品久久久久久一区二区 | 久久三区| 成人免费大片黄在线播放 | 色综久久| 成人精品免费视频 | 在线看片日韩 | 蜜月va乱码一区二区三区 | 欧美精品区 | 国产一区二区视频在线观看 | 在线国产一区二区 | 一区在线视频 | 国产一区二区欧美 | 91大神在线看 | 久久精品91 | 欧美与黑人午夜性猛交久久久 | a免费在线| 91tv亚洲精品香蕉国产一区 | 午夜激情视频免费 | 国产视频一区二区 | 国产精品综合 | 精品久久久久久久久久久院品网 | 一区二区三区国产 | 午夜成人免费电影 | 亚洲婷婷综合网 | 国产午夜视频 | 少妇精品久久久久久久久久 | 精品日韩欧美一区二区三区在线播放 | 国产精品网站在线观看 | 国产精品一区二区三区在线 | 精品久久网| 国产福利在线观看 | 三级欧美在线观看 | 成人伊人 | 亚洲一区二区视频 | 精品视频一区二区三区 | 高清一区二区三区 | 国产99久久精品 | 亚洲成人一区二区 | 九九久久久| av基地网| 九九精品视频在线 | 天天天干夜夜夜操 | 欧美久久视频 | 亚洲欧美另类在线 | 亚洲欧美激情精品一区二区 | 久久av一区二区三区 | 91精品国产99久久久 | 超碰一区二区三区 | 日韩免费在线观看视频 | 黄色在线免费 | 国产激情视频 | 91精品国产一区二区三区蜜臀 | 一级毛片大全免费播放 | 一级全毛片 | 求av网址| 亚洲国产精品久久久久秋霞不卡 | 国产精品资源在线 | 激情自拍偷拍 | 国产在线一区二区三区 | 欧美性网| 日本不卡免费新一二三区 | 国产成人精品免费视频大全最热 | 精品久久久久久久久久久下田 | 精品一区二区三区免费 | 亚洲日韩中文字幕一区 | 国产成人精品一区二 | 黄色资源在线观看 | 亚洲高清视频在线 | 中文字幕成人 | 天堂一区 | 99国产精品久久久久久久 | av网址在线播放 | 中文字幕国产视频 | 91色视频在线观看 | 欧美成人精品一区二区男人看 | 伊人二区 | gav成人免费播放视频 | 91电影在线观看 | 婷婷精品视频 | 国产精品一区二区在线 | 91夜夜蜜桃臀一区二区三区 | 欧美一区2区三区4区公司二百 | 国产目拍亚洲精品99久久精品 | 成人综合网站 | 欧美成人免费在线观看 | 色视频www在线播放国产人成 | 久久69精品久久久久久久电影好 | 午夜精品久久久久久久久 | 日韩欧美在线免费观看 | 在线不卡视频 | 成人h视频在线观看 | 毛片网 | 亚洲一区二区中文字幕在线观看 | 欧美视频一二三区 | 日韩免费福利视频 | 欧美日韩在线观看视频 | 亚洲激情 欧美 | 国产美女精品人人做人人爽 | 黄色片在线 | 在线国产区 | av在线免费观看网站 | av片免费 | a级在线 | 99re在线| 亚洲视频免费在线观看 | 美女视频一区 | 欧洲一级视频 | 久久久999成人 | 国产一区二区精品在线 | 欧美激情欧美激情在线五月 | 久久99国产精一区二区三区 | 欧美日韩亚洲视频 | 鲁视频 | 亚洲精选国产 | 国产精品高清在线 | 天天澡天天狠天天天做 | 黑人巨大精品欧美一区二区免费 | 欧美一级视频 | 国产欧美久久一区二区三区 | 99在线观看| 精品视频一区在线观看 | 欧美日韩一区二区三区在线观看 | 成人免费在线观看 | 国产成年免费视频 | 噜噜噜在线观看免费视频日本 | 亚洲精品www久久久久久广东 | 天天夜碰日日摸日日澡 | 中文字幕亚洲精品 | 亚洲性人人天天夜夜摸 | 我要看免费黄色片 | 色综合成人 | 狠狠操操 | 伊人网伊人 | 久久精品这里热有精品 | 久久成人午夜 | 久久精品国产亚洲精品 | 日韩精品av一区二区三区 | 欧美一级特黄aaaaaa大片在线观看 | 午夜999| 老黄网站在线观看 | 在线精品国产 | 一区二区不卡视频在线观看 | 国产乱视频 | 一区视频 | 色综合天天综合网国产成人网 | 美女国产精品 | 男女精品| 精品久久久99 | 欧美日韩视频在线观看一区 | 一区二区精品 | 午夜久久av | 9色网站 | 国产一二在线 | 国产在线观看av | 欧美成年黄网站色视频 | 日本一级在线观看 | 综合色爱 | 成人影音| 久久精品一区二区三区四区毛片 | 精一区二区 | 狠狠操狠狠摸 | 国产高清视频在线 | 国内在线精品 | 一区二区成人 | 国产在线一 | 亚洲精品美女久久久 | 三级免费毛片 | 成人福利网 | 91社影院在线观看 | 久久久久国产一级毛片 | 日韩一级免费在线观看 | 一级特黄aaa大片在线观看 | 蜜桃αv| 成人午夜影院 | 精品久久国产 | 天天综合欧美 | 日日干,天天干 | 国产中文在线 | www.99日本精品片com | 日韩毛片 | 国产精品国产精品国产 | 国产精品不卡 | 国产成人精品一区二区三区视频 | 欧美激情五月 | 久久久久黄| 亚洲精品视频在线观看免费 | 成人欧美一区二区三区黑人孕妇 | 午夜视频在线观看免费视频 | 制服 丝袜 激情 欧洲 亚洲 | 四虎成人在线播放 | 日韩精品成人 | 久久久国产一区二区 | 成人中文网 | 日韩精品2区 | 91精品国产福利在线观看 | 亚洲成人中文字幕 | 精品久久久久香蕉网 | 日韩xxxbbb| 精品久久久久久久久久 | 欧美日韩精品区 | 伊人影院久久 | 色综合免费视频 | 天天干天天操天天爽 | 欧美精品欧美精品系列 | 亚洲国产天堂久久综合 | 日韩一区二区福利 | 视频一区二区三区在线播放 | 国产精品久久嫩一区二区 免费 | 午夜av毛片 | 日本在线视频一区二区 | 91在线观看视频 | 久久中文字幕一区 | 毛片久久久 | 国产精品日本欧美一区二区三区 | 国产激情精品一区二区三区 | 成人做爰www免费看视频网站 | 亚洲成av人片一区二区梦乃 | 亚洲国产二区 | 久久久av | 欧美一区在线看 | 91视频一区二区 | 国产精品大全 | 国产精品免费一区二区三区四区 | 精品国产髙清在线看国产毛片 | 视频在线一区 | 嫩草视频免费在线观看 | 日韩在线小视频 | 国产精品久久久久久久一区探花 | 激情婷婷 | 欧洲亚洲精品久久久久 | 亚洲国产精品成人 | 亚洲精品久久久久一区二区三区 | а天堂中文最新一区二区三区 | 一区二区三区视频免费在线观看 | 久久久久久久久综合 | 伊人亚洲 | 日韩三级电影在线免费观看 | 91在线看| 91免费看 | 成人久久18免费网站图片 | 黄色毛片看看 | 国产精品99久久久久久大便 | 免费看一区二区三区 | 正在播放国产精品 | 玖玖视频在线 | 精品99视频 | 中文字幕一区二区三 | 亚洲毛片网站 | 精品久 | 国产一级片 | 日韩午夜av | 91网站免费 | 国产欧美一区二区精品久久 | 一二区视频 | xnxx 日本19| 欧洲成人午夜免费大片 | 国产精品激情在线观看 | 中文字幕一区二区三区四区 | 蜜桃精品久久久久久久免费影院 | 一区二区日韩精品 | 婷婷亚洲综合 | www.视频在线观看 | 播放毛片| 国产高清免费视频 | 成人羞羞网站 | 免费观看日韩一级片 | 中国电影黄色一级片免费观看 | 欧美女优在线视频 | 久久亚洲一区二区三区四区五区高 | 亚州中文字幕蜜桃视频 | 一区在线视频观看 | 九色91| 欧美日韩一区在线观看 | 操久在线 | 日本黄色毛片 | 亚洲一区精品在线 | 日韩a∨ | 视频在线一区 | 国产一区二区影院 | 亚洲欧美一区二区三区四区 | 中文字幕久久精品 | 99视频网| 久久久久国产 | 日韩中文字幕一区二区 | 国产婷婷在线视频 | 99精品福利视频 | 久久在线播放 | 99久久久久国产精品免费 | 日本黄色片免费 | 精品国产不卡一区二区三区 | 精品无人乱码一区二区三区的优势 | 欧美日韩干 | 欧美白人做受xxxx视频 | 国产精品欧美一区二区三区 | 精品欧美乱码久久久久久 | 亚洲精选免费视频 | 久久伊人久久 | 国产黄网 | 亚洲不卡在线 | 日本一区二区高清不卡 | 亚洲一区二区三区视频 | 久久视频一区 | 在线观看第一页 | 一 级 黄 色 片免费网站 | 999国产在线 | 精品国产91久久 | 日本成人黄色网址 | 亚洲欧美激情在线 | www.嫩草| 欧美成人一区二区 | 一级黄色片a级 | 欧美日韩电影一区二区 | 亚洲欧美视频在线 | 一级视频网站 | 久久久高清 | 在线久草 | 91视频一区二区 | 亚洲精品久久久一区二区三区 | 亚洲国产精品久久久男人的天堂 | av一级久久 | 国产精品久久精品久久 | 精品国产乱码久久久久久1区2区 | 成人涩涩网站 | 伊人网在线免费观看 | 成人av福利 | 亚洲黄色一区二区三区 | 黄免费视频 | 蜜桃av人人夜夜澡人人爽 | 在线观看国产视频 | 91最新 | 爱爱视频网站 | 欧美一级在线 | 亚洲精品成人无限看 | 亚洲国产精品久久久久久女王 | 色吊丝在线 | 新91在线视频 | 日本综合久久 | 国产精品毛片在线 | 亚洲毛片在线观看 | 久久com | 中文字幕日韩一区二区三区 | 国产小视频在线播放 | 国产日本欧美在线 | 91av亚洲| 色精品| 天堂资源库 | 日本污视频在线观看 | 亚洲精品久久久久久一区二区 | 玖玖精品在线 | 午夜免费视频福利 | 免费黄色毛片视频 | 日本亚洲精品一区二区三区 | 久久色av | 久久伊人免费视频 | 欧美精品一 | 中文字幕婷婷 | 毛片入口 | 久久这里只有精品首页 | 亚洲精品一区二区网址 | 亚洲欧美日韩在线一区 | 天天干狠狠操 | 四虎影院最新网址 | 色婷婷国产精品综合在线观看 | 久久精品色欧美aⅴ一区二区 | 韩国精品一区 | 国产一区二区三区不卡在线观看 | 日韩国产免费观看 | 7799精品视频 | 红桃成人少妇网站 | 国产在线不卡一区 | 久久成人在线视频 | 国产 一区 | 成人影院在线 | av天天干| 亚洲伊人中文字幕 | 99精品久久久 | 国产精品久久久久久久免费大片 | 久久精品一 | 国产精品污www一区二区三区 | 国产 欧美 日韩 一区 | www日韩欧美 | 亚洲视频中文字幕 | 97热在线观看 | 国色天香成人网 | 国产精品久久久久久亚洲调教 | 欧美乱码久久久久久蜜桃 | aaaaaaa片毛片免费观看 | 国产精品久久久久久婷婷天堂 | 久久久99精品免费观看 | 欧美大片黄| 三级在线视频 | 日本99精品| 天堂亚洲 | 亚洲欧美日韩在线一区二区 | 国产女人爽到高潮免费视频 | 91天堂 | 色婷婷综合网 | 在线中文字幕观看 | 欧美成人精品在线观看 | 亚洲精品国产9999久久久久 | 色鲁97精品国产亚洲 | 欧美不卡一区二区三区 | 日本午夜在线 | 日韩资源在线 | 亚洲一区二区三区四区五区午夜 | 日本不卡高字幕在线2019 | 一级黄色片网站 | 中文字幕国产视频 | 色综合久久一区二区三区 | 日韩精品一区在线 | a∨色狠狠一区二区三区 | www97影院| 国产日韩欧美精品 | 亚洲国产高清高潮精品美女 | 黄色毛片在线观看 | 欧美一区 | 日韩一区二区在线免费 | 九九热精品免费视频 | 国产精品三级久久久久久电影 | 成人精品鲁一区一区二区 | 香蕉大人久久国产成人av |