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

Android源碼進階之深入理解Retrofit工作原理

移動開發(fā) Android
Retrofit是一個基于AOP思想,對RestfulApi注解進行動態(tài)代理的網(wǎng)絡(luò)框架;今天我們就來探討下實現(xiàn)原理,一起進步。

?[[422495]]??

本文轉(zhuǎn)載自微信公眾號「Android開發(fā)編程」,作者Android開發(fā)編程。轉(zhuǎn)載本文請聯(lián)系A(chǔ)ndroid開發(fā)編程公眾號。

前言

Retrofit是一個基于AOP思想,對RestfulApi注解進行動態(tài)代理的網(wǎng)絡(luò)框架;

今天我們就來探討下實現(xiàn)原理,一起進步

一、使用Retrofit

1、包引用

在gradle文件中引用retrofit

compile 'com.squareup.retrofit2:retrofit:2.3.0'     compile 'com.squareup.retrofit2:retrofit-converters:2.3.0'     compile 'com.squareup.retrofit2:retrofit-adapters:2.3.0' 

如果需要使用更多擴展功能,比如gson轉(zhuǎn)換,rxjava適配等,可以視自己需要繼續(xù)添加引用;

compile 'com.squareup.retrofit2:converter-gson:2.3.0'     compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' 

如果現(xiàn)有的擴展包不能滿足需要,還可以自己擴展converter,adapter等;

2、定義接口

Retrofit要求定義一個網(wǎng)絡(luò)請求的接口,接口函數(shù)里要定義url路徑、請求參數(shù)、返回類型;

public interface INetApiService {     @GET("/demobiz/api.php")     Call<BizEntity> getBizInfo(@Query("id") String id); } 

在這個接口定義中,用注解@GET("/demobiz/api.php")聲明了url路徑,用注解@Query("id") 聲明了請求參數(shù);

最重要的是,用Call聲明了返回值是一個Retrofit的Call對象,并且聲明了這個對象處理的數(shù)據(jù)類型為BizEntity,BizEntity是我們自定義的數(shù)據(jù)模型;

3、依次獲得Retrofit對象、接口實例對象、網(wǎng)絡(luò)工作對象

首先,需要新建一個retrofit對象;

然后,根據(jù)上一步的接口,實現(xiàn)一個retrofit加工過的接口對象;

最后,調(diào)用接口函數(shù),得到一個可以執(zhí)行網(wǎng)絡(luò)訪問的網(wǎng)絡(luò)工作對象;

//新建一個Retrofit對象 Retrofit retrofit=new Retrofit.Builder() .baseUrl(Config.DOMAIN)//要訪問的網(wǎng)絡(luò)地址域名,如http://www.zhihu.com .addConverterFactory(GsonConverterFactory.create()) .build(); ... //用retrofit加工出對應(yīng)的接口實例對象 INetApiService netApiService= retrofit.create(INetApiService.class); //可以繼續(xù)加工出其他接口實例對象 IOtherService otherService= retrofit.create(IOtherService.class); ··· //調(diào)用接口函數(shù),獲得網(wǎng)絡(luò)工作對象 Call<BizEntity> callWorker= netApiService.getBizInfo("id001"); 

這個復(fù)雜的過程下來,最終得到的callWorker對象,才可以執(zhí)行網(wǎng)絡(luò)訪問。

4、訪問網(wǎng)絡(luò)數(shù)據(jù)

用上一步獲取的worker對象,執(zhí)行網(wǎng)絡(luò)請求

callWorker.enqueue(new Callback<BizEntity>() {             @Override             public void onResponse(Call<BizEntity> call, Response<BizEntity> response) {...}             @Override             public void onFailure(Call<BizEntity> call, Throwable t) {...}         }); 

在回調(diào)函數(shù)里,取得我們需要的BizEntity數(shù)據(jù)對象

二、Retrofit實現(xiàn)原理

???

1、Retrofit對象的構(gòu)建就是簡單的builder模式,直接看create

//Retrofit.java public <T> T create(final Class<T> service) {     //驗證     validateServiceInterface(service);     return (T)         //動態(tài)代理         Proxy.newProxyInstance(         service.getClassLoader(), //類加載器         new Class<?>[] {service}, //一組接口         new InvocationHandler() {             //判斷android和jvm平臺及其版本             private final Platform platform = Platform.get();             @Override             public Object invoke(Object proxy, Method method, Object[] args){                 //如果該方法是Object的方法,直接執(zhí)行不用管                 if (method.getDeclaringClass() == Object.class) {                     return method.invoke(this, args);                 }                 //isDefaultMethod:檢查是否是java8開始支持的接口默認(rèn)方法                 return platform.isDefaultMethod(method)                     ? platform.invokeDefaultMethod(method, service, proxy, args)                     : loadServiceMethod(method).invoke(args); //我們關(guān)注這里             }         }); } 

Proxy.newProxyInstance動態(tài)代理,運行期會生成一個類(字節(jié)碼)如$ProxyN,實現(xiàn)傳入的接口即WanApi,重寫接口方法然后轉(zhuǎn)發(fā)給InvocationHandler的invoke

class $ProxyN extends Proxy implements WanApi{     Call<WanArticleBean> articleList(@Path("page") int page){         //轉(zhuǎn)發(fā)給invocationHandler         invocationHandler.invoke(this,method,args);     } } 

2、validateServiceInterface驗證邏輯

//Retrofit.java private void validateServiceInterface(Class<?> service) {     //檢查:WanApi不是接口就拋異常...     //檢查:WanApi不能有泛型參數(shù),不能實現(xiàn)其他接口...     if (validateEagerly) { //是否進行嚴(yán)格檢查,默認(rèn)關(guān)閉         Platform platform = Platform.get();         for (Method method : service.getDeclaredMethods()) { //遍歷WanApi方法             //不是默認(rèn)方法,并且不是靜態(tài)方法             if (!platform.isDefaultMethod(method) && !Modifier.isStatic(method.getModifiers())) {                 //把方法提前加載進來(檢查下有沒有問題)                 loadServiceMethod(method);             }         }     } } 

如果開了validateEagerly,會一次性把接口WanApi的所有方法都檢查一遍并加載進來,可以在debug模式下開啟,提前發(fā)現(xiàn)錯誤寫法,比如在@GET請求設(shè)置了@Body這種錯誤就會拋出異常:

java.lang.IllegalArgumentException: Non-body HTTP method cannot contain @Body. 

3、loadServiceMethod

然后是loadServiceMethod(method).invoke(args),看名字可知是先找方法,然后執(zhí)行

//Retrofit.java //緩存,用了線程安全ConcurrentHashMap final Map<Method, ServiceMethod<?>> serviceMethodCache = new ConcurrentHashMap<>(); ServiceMethod<?> loadServiceMethod(Method method) {     ServiceMethod<?> result = serviceMethodCache.get(method);     //WanApi的articleList方法已緩存,直接返回     if (result != null) return result;     synchronized (serviceMethodCache) {         result = serviceMethodCache.get(method);         if (result == null) {             //解析articleList的注解,創(chuàng)建ServiceMethod并緩存起來             result = ServiceMethod.parseAnnotations(this, method);             serviceMethodCache.put(method, result);         }     }     return result; } 

跟進ServiceMethod.parseAnnotations

//ServiceMethod.java static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {     //1.     RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);     //檢查:articleList方法返回類型不能用通配符和void...     //2.     return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory); } 

4、 RequestFactory.parseAnnotations

//RequestFactory.java static RequestFactory parseAnnotations(Retrofit retrofit, Method method) {     return new Builder(retrofit, method).build(); } class Builder {     RequestFactory build() {         //解析方法注解如GET         for (Annotation annotation : methodAnnotations) {             parseMethodAnnotation(annotation);         }         //省略各種檢查...         //解析參數(shù)注解如Path         int parameterCount = parameterAnnotationsArray.length;         parameterHandlers = new ParameterHandler<?>[parameterCount];         for (int p = 0, lastParameter = parameterCount - 1; p < parameterCount; p++) {             parameterHandlers[p] =                 parseParameter(p, parameterTypes[p], parameterAnnotationsArray[p], p == lastParameter);         }         //省略各種檢查...         return new RequestFactory(this);     } } 

得到RequestFactory后, HttpServiceMethod.parseAnnotations,HttpServiceMethod負(fù)責(zé)適配和轉(zhuǎn)換處理,將接口方法的調(diào)用調(diào)整為HTTP調(diào)用

//HttpServiceMethod.java //ResponseT響應(yīng)類型如WanArticleBean,ReturnT返回類型如Call static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations(     Retrofit retrofit, Method method, RequestFactory requestFactory) {     //省略kotlin協(xié)程邏輯...     Annotation[] annotations = method.getAnnotations();     //遍歷找到合適的適配器     CallAdapter<ResponseT, ReturnT> callAdapter =         createCallAdapter(retrofit, method, adapterType, annotations);     //得到響應(yīng)類型,如WanArticleBean     Type responseType = callAdapter.responseType();     //遍歷找到合適的轉(zhuǎn)換器     Converter<ResponseBody, ResponseT> responseConverter =         createResponseConverter(retrofit, method, responseType);     okhttp3.Call.Factory callFactory = retrofit.callFactory;     return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter); } 

5、最終返回了一個CallAdapted,看到CallAdapted

//CallAdapted extends HttpServiceMethod extends ServiceMethod class CallAdapted<ResponseT, ReturnT> extends HttpServiceMethod<ResponseT, ReturnT> {     private final CallAdapter<ResponseT, ReturnT> callAdapter;     CallAdapted(         RequestFactory requestFactory,         okhttp3.Call.Factory callFactory,         Converter<ResponseBody, ResponseT> responseConverter,         CallAdapter<ResponseT, ReturnT> callAdapter) {         super(requestFactory, callFactory, responseConverter);         this.callAdapter = callAdapter;     }     @Override     protected ReturnT adapt(Call<ResponseT> call, Object[] args) {         //適配器         return callAdapter.adapt(call);     } } 

回到Retrofit.Builder

//Retrofit.Builder.java public Retrofit build() {     Executor callbackExecutor = this.callbackExecutor;     //如果沒設(shè)置線程池,則給android平臺設(shè)置一個默認(rèn)的MainThreadExecutor(用Handler將回調(diào)切回主線程)     if (callbackExecutor == null) {         callbackExecutor = platform.defaultCallbackExecutor();     }     List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);     //添加默認(rèn)的DefaultCallAdapterFactory     callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor)); } 

DefaultCallAdapterFactory這個工廠創(chuàng)建具體的CallAdapter實例

//DefaultCallAdapterFactory.java public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {     final Type responseType = Utils.getParameterUpperBound(0, (ParameterizedType) returnType);     //如果指定了SkipCallbackExecutor注解,就表示不需要切回主線程     final Executor executor =         Utils.isAnnotationPresent(annotations, SkipCallbackExecutor.class)         ? null         : callbackExecutor;     return new CallAdapter<Object, Call<?>>() {         @Override         public Type responseType() {             return responseType;         }         @Override         public Call<Object> adapt(Call<Object> call) {             //默認(rèn)情況下,返回用主線程池包裝的Call,他的enqueue會使用主線程池的execute             return executor == null ? call : new ExecutorCallbackCall<>(executor, call);         }     }; } 

6、invoke

前邊loadServiceMethod得到了CallAdapted,然后執(zhí)行invoke,實現(xiàn)在父類HttpServiceMethod里,

//HttpServiceMethod.java final ReturnT invoke(Object[] args) {     //終于見到okhttp了!     Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);     return adapt(call, args); } class CallAdapted<ResponseT, ReturnT> extends HttpServiceMethod<ResponseT, ReturnT> {     private final CallAdapter<ResponseT, ReturnT> callAdapter;     @Override     protected ReturnT adapt(Call<ResponseT> call, Object[] args) {         //用前邊得到的適配器,把OkHttpCall包成ExecutorCallbackCall         return callAdapter.adapt(call);     } } 

然后是請求入隊,ExecutorCallbackCall.enqueue -> OkHttpCall.enqueue,

//ExecutorCallbackCall.java void enqueue(final Callback<T> callback) {     delegate.enqueue(         new Callback<T>() {             @Override             public void onResponse(Call<T> call, final Response<T> response) {                 //將回調(diào)切回主線程                 callbackExecutor.execute(                     () -> {                         callback.onResponse(ExecutorCallbackCall.this, response);                     });                 //...             }             @Override             public void onFailure(Call<T> call, final Throwable t) {}         }); } //OkHttpCall.java void enqueue(final Callback<T> callback) {     //okhttp邏輯     okhttp3.Call call;     call.enqueue(new okhttp3.Callback() {         void onResponse(okhttp3.Call call, okhttp3.Response rawResponse) {             callback.onResponse(OkHttpCall.this, response);         }     }) } 

到此整個流程就通了

二、功能擴展

1、OkHttpClient

Retrofit使用OkHttpClient來實現(xiàn)網(wǎng)絡(luò)請求,這個OkHttpClient雖然不能替換為其他的網(wǎng)絡(luò)執(zhí)行框架比如Volley,但是Retrofit允許我們使用自己擴展OkHttpClient,一般最常擴展的就是Interceptor攔截器了;

OkHttpClient mClient = new OkHttpClient.Builder()                 .addInterceptor(new Interceptor() {                     @Override                     public Response intercept(Chain chain) throws IOException {                         try {                             Request.Builder builder = chain.request().newBuilder();                             builder.addHeader("Accept-Charset", "UTF-8");                             builder.addHeader("Accept", " application/json");                             builder.addHeader("Content-type", "application/json");                             Request request = builder.build();                             return chain.proceed(request);                         } catch (Exception e) {                             e.printStackTrace();                         }                         return null;                     }                 }).build(); Retrofit retrofit = new Retrofit.Builder()                 .baseUrl(Config.DOMAIN)                 .addConverterFactory(GsonConverterFactory.create())                 .client(mClient)                 .build(); 

2、addConverterFactory

擴展的是對返回的數(shù)據(jù)類型的自動轉(zhuǎn)換,把一種數(shù)據(jù)對象轉(zhuǎn)換為另一種數(shù)據(jù)對象;

GsonConverterFactory可以把Http訪問得到的json字符串轉(zhuǎn)換為Java數(shù)據(jù)對象BizEntity,這個BizEntity是在INetApiService接口中要求的的;

如果現(xiàn)有的擴展包不能滿足需要,可以繼承Retrofit的接口。retrofit2.Converter

在創(chuàng)建Retrofit對象時,可以插入我們自定義的ConverterFactory;

//retrofit對象 Retrofit retrofit=new Retrofit.Builder() .baseUrl(Config.DOMAIN) .addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(YourConverterFactory.create())//添加自定義Converter .build(); 

3、addCallAdapterFactory

擴展的是對網(wǎng)絡(luò)工作對象callWorker的自動轉(zhuǎn)換,把Retrofit中執(zhí)行網(wǎng)絡(luò)請求的Call對象,轉(zhuǎn)換為接口中定義的Call對象;

這個轉(zhuǎn)換不太好理解,我們可以對照下圖來理解:

???

Retrofit本身用一個OkHttpCall的類負(fù)責(zé)處理網(wǎng)絡(luò)請求,而我們在接口中定義需要定義很多種Call,接口里的Call和Retrofit里的OkHttpCall并不一致,所以我們需要用一個CallAdapter去做一個適配轉(zhuǎn)換;

這其實是Retrofit非常核心,也非常好用的一個設(shè)計,如果我們在接口中要求的函數(shù)返回值是個RxJava的Flowable對象

public interface INetApiService {     @GET("/demobiz/api.php")     Flowable<BizEntity> getBizInfo(@Query("id") String id); } 

那么我們只需要為Retrofit添加對應(yīng)的擴展;

//retrofit對象 Retrofit retrofit=new Retrofit.Builder() .baseUrl(Config.DOMAIN) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); 

就能得到Flowable類型的callWorker對象;

//用retrofit加工出對應(yīng)的接口實例對象 INetApiService netApiService= retrofit.create(INetApiService.class); ··· //調(diào)用接口函數(shù),獲得網(wǎng)絡(luò)工作對象 Flowable<BizEntity> callWorker= netApiService.getBizInfo("id001"); 在這里,callAdapter做的事情就是把retrofit2.Call對象適配轉(zhuǎn)換為Flowable<T>對象; 

同樣,如果現(xiàn)有的擴展包不能滿足需要,可以繼承Retrofit的接口;retrofit2.CallAdapter

4、動態(tài)替換url

在構(gòu)建Retrofit時傳入HttpUrl對象,之后這個實例就一直存在不會更改,所以可以反射修改他的字段比如host,來實現(xiàn)動態(tài)替換服務(wù)端地址;

String SERVER = "https://www.xxx.com/"; HttpUrl httpUrl = HttpUrl.get(SERVER); Retrofit retrofit = new Retrofit.Builder()     //.baseUrl(SERVER)     .baseUrl(httpUrl) //使用HttpUrl     .build(); 

總結(jié):

1.Retrofit將Http請求抽象成java接口

2.接口里用注解 描述和配置網(wǎng)絡(luò)請求參數(shù)




3.動態(tài)代理的方式來生成call對象。


責(zé)任編輯:武曉燕 來源: Android開發(fā)編程
相關(guān)推薦

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2021-09-10 07:31:54

AndroidAppStartup原理

2021-08-24 07:53:28

AndroidActivity生命周期

2024-11-01 08:57:07

2021-09-17 06:55:50

AndroidLayoutView

2023-09-19 22:47:39

Java內(nèi)存

2021-09-30 07:36:51

AndroidViewDraw

2022-09-05 22:22:00

Stream操作對象

2021-09-07 06:40:25

AndroidLiveData原理

2021-09-16 06:44:04

Android進階流程

2014-07-15 17:17:31

AdapterAndroid

2021-09-15 07:31:33

Android窗口管理

2021-09-24 08:10:40

Java 語言 Java 基礎(chǔ)

2017-08-08 09:15:41

前端JavaScript頁面渲染

2021-10-26 17:52:52

Android插件化技術(shù)

2021-02-17 11:25:33

前端JavaScriptthis

2021-10-21 10:02:37

Java開發(fā)代碼

2021-10-10 13:31:14

Java負(fù)載均衡算法

2016-10-26 20:49:24

ReactJavascript前端

2020-08-10 18:03:54

Cache存儲器CPU
點贊
收藏

51CTO技術(shù)棧公眾號

午夜时刻免费入口| av网址在线观看免费| 亚洲黄色精品视频| 亚洲伦伦在线| 国产亚洲欧洲高清| 在线观看免费视频污| 91色在线看| 国产农村妇女精品| 99久热re在线精品视频| 精人妻无码一区二区三区| 日韩国产欧美一区二区| 亚洲大胆人体av| 亚洲国产高清av| 成年人视频免费在线播放| 国产午夜精品久久久久久免费视| 91夜夜揉人人捏人人添红杏| xxxx.国产| 伊人情人综合网| 亚洲人成网站999久久久综合| 日本网站在线看| av日韩亚洲| 亚洲综合免费观看高清完整版在线| 欧美一区二区在线视频观看| 99热这里只有精品5| 久久精品一区| 欧美极品少妇xxxxⅹ喷水| 91精品久久久久久久久久久久| 日本免费一区二区三区视频| 欧美日韩中文国产| 一本大道熟女人妻中文字幕在线| av片在线观看| 中文字幕不卡在线观看| 久久久久一区二区| 精品毛片在线观看| 国产中文字幕一区| 国产欧美精品xxxx另类| 日韩在线 中文字幕| 极品少妇一区二区三区| 欧美成人精品影院| 日本女人性生活视频| 欧美人妖在线| 日韩精品极品在线观看播放免费视频 | 伊人久久久久久久久| 成人精品一区二区三区电影| 日韩欧美亚洲成人| 国产免费一区二区三区视频| 韩国成人二区| 婷婷夜色潮精品综合在线| 日韩激情视频一区二区| 日韩激情av| 一区二区三区四区视频精品免费| 91免费网站视频| 日本高清视频在线观看| 国产精品久久久久久久久图文区 | 欧美日韩伦理片| 91污片在线观看| 久久香蕉综合色| 青青草手机在线| 久久亚洲精品国产精品紫薇| 美女黄毛**国产精品啪啪| 五月婷婷丁香网| 26uuu欧美| 视频一区视频二区视频三区视频四区国产 | 亚洲国产精品久| 在线成人亚洲| 欧美在线视频导航| 精品久久久久久久久久久国产字幕| 欧美亚洲在线| 国产精品久久久久秋霞鲁丝| 中文字幕你懂的| 国产专区欧美精品| 国产伦精品一区二区三区视频黑人 | 中文精品99久久国产香蕉| 国产传媒在线看| 888久久久| 国a精品视频大全| 日日噜噜噜噜人人爽亚洲精品| 久久综合导航| 91精品视频在线看| 亚洲国产精品久久久久久6q| 97超碰欧美中文字幕| 日韩精品欧美专区| 精品麻豆一区二区三区| 亚洲午夜免费视频| 亚洲视频在线a| 日本伊人久久| 精品无人区乱码1区2区3区在线 | 男男受被啪到高潮自述| 精品亚洲免a| 一区二区三区精品99久久 | 国产高清一区在线观看| 一区二区三区中文字幕| 人人妻人人添人人爽欧美一区| 日韩在线观看不卡| 精品三级在线观看| 中文字幕人妻一区二区三区在线视频| 午夜精品毛片| 538国产精品一区二区免费视频 | 国产对白在线播放| 自拍视频在线看| 欧美一级xxx| 日韩乱码人妻无码中文字幕久久| 国产精品99在线观看| 午夜精品一区二区三区av| 中文人妻熟女乱又乱精品| 成人午夜视频免费看| 日本一区免费观看| 性欧美猛交videos| 欧洲亚洲国产日韩| 男男一级淫片免费播放| 国产大片一区| 国产成人精品一区二区三区| 亚洲精品久久久久久无码色欲四季| 国产肉丝袜一区二区| 免费人成在线观看视频播放| 99精品国自产在线| 亚洲欧美另类国产| 国产一级中文字幕| 精品一区二区在线看| 欧美精品亚洲精品| 日韩大片免费观看| 欧美大片在线观看一区| 91导航在线观看| 久久青草久久| 国产精品一 二 三| 日韩影视在线| 日韩一区二区不卡| 在线视频这里只有精品| 日本va欧美va精品发布| 热re99久久精品国产99热 | 91精品久久久久久久久久久久久久| 特黄视频在线观看| 亚洲午夜激情av| 真实乱偷全部视频| 欧美大片一区| 成人羞羞国产免费| 里番在线观看网站| 欧美日韩国产欧美日美国产精品| 自拍偷拍视频亚洲| 久久99伊人| 欧美人与性禽动交精品| 亚洲天堂手机| 日韩精品在线视频美女| 日韩av电影网| 成人国产亚洲欧美成人综合网| 996这里只有精品| 伊色综合久久之综合久久| 久久99久久久久久久噜噜| 国产黄色小视频在线观看| 亚洲免费观看高清| 91精品国产高清91久久久久久| 欧美不卡一区| 国产精品久久久久久久小唯西川| 久草成色在线| 亚洲国产欧美一区二区丝袜黑人| 天天操天天射天天爽| 成人av电影在线播放| 欧美黑人经典片免费观看| 欧美激情影院| 国产激情久久久久| 免费网站免费进入在线| 制服丝袜亚洲网站| 精品一区在线视频| 不卡的看片网站| 欧美日韩一区二区在线免费观看 | 91免费小视频| 国产无套粉嫩白浆内谢的出处| 色乱码一区二区三区网站| 91视频免费在线| 超免费在线视频| 亚洲欧美激情在线视频| 91禁在线观看| 亚洲国产精品嫩草影院| 30一40一50老女人毛片| 久久精品观看| 黄色高清视频网站| 高清精品xnxxcom| 国产成人精品午夜| 日本在线视频网址| 亚洲美女在线视频| 国产又粗又长又黄| 精品国产老师黑色丝袜高跟鞋| 波多野在线播放| 国产精品一级在线| 波多野结衣家庭教师在线| 日韩欧美网站| 狠狠色综合色区| 欧美xxxx性| 亚州精品天堂中文字幕| 在线中文资源天堂| 亚洲国产成人久久综合| 中文字幕一区二区三区人妻四季| 亚洲精品欧美综合四区| 亚洲成人网在线播放| 国产一区免费电影| 国模杨依粉嫩蝴蝶150p| 欧美成人精品| 亚洲精品在线免费| 欧美黑白配在线| 亚洲影视九九影院在线观看| 日本不卡一二三| 欧美人成在线视频| 北岛玲日韩精品一区二区三区| 精品久久人人做人人爽| 最新中文字幕免费| 丁香五六月婷婷久久激情| 一区二区三区影视| 国产欧美一区二区精品性| 美女黄色一级视频| 国产一区二区三区不卡在线观看 | 色香蕉在线观看| 日韩av中文字幕一区| 亚洲综合在线小说| a∨色狠狠一区二区三区| 91成人精品网站| 免费网站在线观看人| 日韩在线一区二区三区免费视频| 日本韩国一区| 亚洲精品aⅴ中文字幕乱码 | 精品亚洲aⅴ在线观看| 99久久婷婷国产一区二区三区| 91久久国产最好的精华液| 日韩精品无码一区二区| 亚洲精品国产第一综合99久久| 亚洲色图 激情小说| 久久久久久久久久电影| 捆绑凌虐一区二区三区| 国产1区2区3区精品美女| 免费黄频在线观看| 久久电影国产免费久久电影| 中文字幕一区二区三区四区在线视频 | 日韩小视频网址| www在线播放| 亚洲性生活视频在线观看| 每日更新在线观看av| 日韩精品在线视频观看| 天堂av电影在线观看| 亚洲精品v天堂中文字幕| 亚洲成a人片77777精品| 日韩欧美国产电影| 丰满人妻av一区二区三区| 日韩手机在线导航| 亚洲AV无码一区二区三区少妇 | 欧美日韩影院| 日产精品久久久久久久蜜臀| 国产精品v日韩精品v欧美精品网站| 日韩不卡一二区| 欧美精品导航| 成品人视频ww入口| 亚洲国产免费看| 久久久久久久久久久视频| 国产日韩专区| 99草草国产熟女视频在线| 日韩精品亚洲专区| www.精品在线| 国产精品自在欧美一区| 少妇丰满尤物大尺度写真| 国产一区二区女| 丰满少妇xbxb毛片日本| 99精品在线观看视频| 37p粉嫩大胆色噜噜噜| 国产日韩欧美一区二区三区综合| 成人黄色a级片| 亚洲美女偷拍久久| 日韩精品人妻中文字幕| 色8久久精品久久久久久蜜| 国产原创中文av| 精品国产乱码久久久久久图片| 少妇一区二区三区四区| 亚洲欧美日韩国产中文| 一区二区三区视频在线观看视频| 免费av一区二区| 国产美女高潮在线观看| 国产精品露脸av在线| 久久精品免视看国产成人| 久久av一区二区| 色乱码一区二区三区网站| 日本天堂免费a| 欧美亚洲一区二区三区| 九九九九九国产| thepron国产精品| 微拍福利一区二区| 亚洲网友自拍偷拍| 最近中文字幕免费在线观看| 欧美一区二区三区视频免费播放| 熟妇人妻一区二区三区四区| 亚洲性猛交xxxxwww| 男女视频在线| 国产裸体写真av一区二区 | 涩涩涩久久久成人精品| 国产麻豆一区二区三区在线观看| 国产一区2区| 99久久免费观看| 蜜臀久久99精品久久久久宅男| 三级网站免费看| 国产视频一区不卡| 国产精品1000| 在线电影国产精品| 欧美孕妇孕交| 久久久久亚洲精品国产| 国产精品xxx| 久久综合伊人77777麻豆| 欧美激情第二页| 国产喷水theporn| 91蝌蚪国产九色| 久久亚洲AV无码| 欧美日韩国产综合一区二区| 完全免费av在线播放| 捆绑调教美女网站视频一区| 国产福利短视频| 亚洲永久免费视频| 一级片视频免费| 亚洲欧洲激情在线| 国产资源在线观看入口av| 成人激情黄色网| 欧洲福利电影| 99re在线视频免费观看| va亚洲va日韩不卡在线观看| 精品国产欧美日韩不卡在线观看| 欧美日韩中文一区| 搞黄视频免费在线观看| 日韩av黄色在线观看| 精品综合久久88少妇激情| 成人短视频在线观看免费| 精品无人码麻豆乱码1区2区| 少妇av片在线观看| 91高清在线观看| 高清av电影在线观看| 国产精品高潮粉嫩av| 在线一级成人| 国内外成人激情视频| 久久综合五月天婷婷伊人| 日韩av免费网址| 亚洲精品国产拍免费91在线| segui88久久综合| 国产一区二区三区高清| 国产一区久久| 国产视频精品视频| 五月天久久比比资源色| 日本精品一二区| 69av视频在线播放| 竹菊久久久久久久| 国产免费人做人爱午夜视频| 久久综合久久综合九色| 日日骚av一区二区| 在线激情影院一区| 久久国产三级| 人人妻人人澡人人爽精品欧美一区| 精品亚洲成a人在线观看| 日韩在线观看视频一区二区| 91精品久久久久久蜜臀| 中文字幕免费高清电视剧网站在线观看 | 97免费视频观看| 99精品偷自拍| 伊人中文字幕在线观看| 亚洲最大在线视频| 伊人久久一区| 日韩精品综合在线| 26uuu成人网一区二区三区| www.com亚洲| 精品精品国产国产自在线| 亚洲国产aⅴ精品一区二区| 国产免费黄色小视频| 久久久精品日韩欧美| 糖心vlog精品一区二区| 久久福利网址导航| 久久99国产精品久久99大师 | 波多野结衣三级在线| 成人免费观看av| 国内av在线播放| 久热99视频在线观看| 噜噜噜狠狠夜夜躁精品仙踪林| 国产日韩一区二区在线观看| 中文字幕中文字幕在线一区| 亚洲第一视频在线| 日本精品视频在线| 91精品推荐| 黄色工厂在线观看| 91精品国产综合久久久久久漫画 | 国产网站无遮挡| 欧美三级中文字幕在线观看| 亚洲夜夜综合| 欧美最大成人综合网| 国产精品91xxx| 欧美日韩综合一区二区三区| 久久综合久久88| 蜜桃成人av| 国产调教打屁股xxxx网站| 色综合久久久网| 超碰在线免费播放| 欧美日韩在线精品一区二区三区| 国产精品影视网| 自拍偷拍校园春色| 欧美俄罗斯性视频| 日韩精品免费| 久久久久麻豆v国产精华液好用吗| 欧美日韩国产在线观看| 国产美女精品写真福利视频| 国产又粗又爽又黄的视频| 久久伊人中文字幕|