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

利器OkHttp的使用以及簡單封裝

移動開發 Android
Android為我們提供了兩種HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client,雖然兩者都支持HTTPS,流的上傳和下載,配置超時,IPv6和連接池,已足夠滿足我們各種HTTP請求的需求。但更高效的使用HTTP可以讓您的應用運行更快、更節省流量。而OkHttp庫就是為此而生。 OkHttp是一個高效的HTTP庫。

前言

Android開發中網絡編程是必不可少的,不接入互聯網的APP就沒有盈利可言。廢話不多說了,下面請先看Android中網絡請求的進化圖:

Android中網絡請求的進化圖 

HttpURLConnection,Apache HTTP Client,Volley到現在的OKHttp,可謂天外有天,人外有人。為什么OKHttp會這么火呢,相信下面的介紹會告訴你答案。

OKHttp的簡介

首先,給出OKHttp的項目地址:https://github.com/square/okhttp

Android為我們提供了兩種HTTP交互的方式: HttpURLConnection 和 Apache HTTP Client,雖然兩者都支持HTTPS,流的上傳和下載,配置超時,IPv6和連接池,已足夠滿足我們各種HTTP請求的需求。但更高效的使用HTTP可以讓您的應用運行更快、更節省流量。而OkHttp庫就是為此而生。 OkHttp是一個高效的HTTP庫:

1.支持 SPDY ,共享同一個Socket來處理同一個服務器的所有請求

2.如果SPDY不可用,則通過連接池來減少請求延時

3.無縫的支持GZIP來減少數據流量

1.緩存響應數據來減少重復的網絡請求

2.一般的get請求

3.一般的post請求

4.基于Http的文件上傳

5.文件下載

6.加載圖片

7.支持請求回調,直接返回對象、對象集合

8.支持session的保持

OkHttp會從很多常用的連接問題中自動恢復。如果您的服務器配置了多個IP地址,當***個IP連接失敗的時候,會自動嘗試下一個IP。OkHttp還處理了代理服務器問題和SSL握手失敗問題。(并發) 使用 OkHttp 無需重寫您程序中的網絡代碼。OkHttp實現了幾乎和java.net.HttpURLConnection一樣的API。如果您用了 Apache HttpClient,則OkHttp也提供了一個對應的okhttp-apache 模塊。 從上面的簡單介紹中可以知道,雖然在編程上面并不會簡潔很多,但是OKHttp內部的一些功能能夠幫助我們自動完成一些很復雜的操作,筆者個人認為***的賣點就是大大節省用戶的流量。

OKHttp的基本使用

1、在Gradle中引入CardView的依賴庫。

  1. compile 'com.squareup.okhttp:okhttp:3.8.0' 

2、OKHttp在使用之前,首先要了解下面幾個比較核心的類以及它的功能。

  • OkHttpClient 客戶端對象
  • Request是OkHttp中訪問的請求,Post請求中需要包含RequestBody
  • Builder是輔助類,用于生產對象
  • Response即OkHttp中的響應,響應中可以得到返回是否成功,返回數據
  • MediaType 數據類型,用來表明是JSON等一系列格式
  • RequestBody 請求數據,在Post請求中用到
  • client.newCall(request).execute()是同步的請求方法
  • client.newCall(request).enqueue(Callback callBack)是異步的請求方法,但是Callback里面的代碼是執行在子線程的,因此不能更新UI。

3、OKHttp的基本使用步驟(以POST方式從服務器取JSON數據為例)

  • 創建OkHttpClient對象,官方文檔要求我們***使用單例模式,在后文對OKHttp進行封裝的時候會提到。
  • 如果是post請求的話,需要通過FormEncodingBuilder創建RequestBody對象,指定需要post傳進去的參數。get請求則不用。
  • 創建Request對象,這個對象是請求對象,需要指定URL。post請求的時候需要指定RequestBody對象,get請求則不用。
  • 調用OkHttpClient的newCall方法,把Request對象傳進去,然后執行execute或者enqueue方法,兩者的區別在上文已提到。在CallBack中的onResponse方法就可以做你需要做的事。onResponse回調的參數是response,一般情況下,比如我們希望獲得返回的字符串,可以通過response.body().string()獲取;如果希望獲得返回的二進制字節數組,則調用response.body().bytes();如果你想拿到返回的inputStream,則調用response.body().byteStream()看到這,你可能會奇怪,竟然還能拿到返回的inputStream,看到這個最起碼能意識到一點,這里支持大文件下載,有inputStream我們就可以通過IO的方式寫文件。不過也說明一個問題,這個onResponse執行的線程并不是UI線程。的確是的,如果你希望操作控件,還是需要使用handler等。
  1. OkHttpClient client = new OkHttpClient(); 
  2.  
  3.     RequestBody body = new FormEncodingBuilder() 
  4.             .add("type""1"
  5.             .build();    Request request = new Request.Builder() 
  6.             .url(Constants.URL_BANNER) 
  7.             .post(body) 
  8.             .build(); 
  9.  
  10.     client.newCall(request).enqueue(new Callback() { 
  11.         @Override         
  12.     public void onFailure(Request request, IOException e) { 
  13.  
  14.         } 
  15.  
  16.         @Override         
  17.     public void onResponse(Response response) throws IOException {             
  18.             if (response.isSuccessful()) { 
  19.  
  20.                 android.os.Message msg = new Message(); 
  21.                 msg.what = 1; 
  22.                 msg.obj = response.body().string(); 
  23.                 mHandler.sendMessage(msg); 
  24.             } 
  25.         } 
  26.     });  

這里只是一個簡單post請求,從服務器獲取數據的介紹,至于get請求只不過是去掉RequestBody對象而已。至于如何向服務器提交數據,可以在熟悉上面的基本用法之后查閱官方的WIKI(GitHub的介紹文檔)。

OKHttp的簡單封裝

回顧上面的代碼,試想一下如果每次請求都寫這么多重復代碼,這樣會嚴重降低開發效率,因此需要對OKHttp進行封裝。對代碼進行封裝是我們最為面向對象程序員的基本素養,減少重復代碼,降低維護難度以及成本。

GitHub上也有對OKHttp進行過封裝,叫做OKHttpUtils。不過這里我們自己動手,一起來學習一下如何進行封裝。具體的注意點有下面幾點:

1、首先,OKHttp官方要求我們***用單例模式去使用OKHttpClient類的,因此我們自定義一個OKHttpHelper類,并且使用單例模式。

2、對get以及post方法進行封裝,主要的思想是把共同的代碼抽取出來,例如代碼中被抽取出來的request方法。

3、對外公開一些靜態方法,包括get和post方法等。

4、Callback基類,對OKHttp的回調進行封裝。這個類用里面有一個type,是方便回調中使用Gson對JSON進行解析的封裝。使用Callback的時候只需要在泛型中傳入類似Data 、List<Data>即可以方便地使用JSON。

5、由于原來的回調不在主線程,因此我們需要使用Handler來將回調放入主線程。

其余的可以參照代碼,有詳細注釋。

  1. /** 
  2.  * 這個類用來輔助OKHttp 
  3.  */public class OkHttpHelper {    /** 
  4.      * 采用單例模式使用OkHttpClient 
  5.      */ 
  6.     private static OkHttpHelper mOkHttpHelperInstance;     
  7.     private static OkHttpClient mClientInstance;     
  8.     private Handler mHandler;     
  9.     private Gson mGson;    /** 
  10.      * 單例模式,私有構造函數,構造函數里面進行一些初始化 
  11.      */ 
  12.     private OkHttpHelper() { 
  13.         mClientInstance = new OkHttpClient(); 
  14.  
  15.         mClientInstance.setConnectTimeout(10, TimeUnit.SECONDS); 
  16.         mClientInstance.setReadTimeout(10, TimeUnit.SECONDS); 
  17.         mClientInstance.setWriteTimeout(30, TimeUnit.SECONDS); 
  18.         mGson = new Gson(); 
  19.  
  20.         mHandler = new Handler(Looper.getMainLooper()); 
  21.     }    /** 
  22.      * 獲取實例 
  23.      * 
  24.      * @return 
  25.      */ 
  26.     public static OkHttpHelper getinstance() {         
  27.         if (mOkHttpHelperInstance == null) {             
  28.             synchronized (OkHttpHelper.class) {                 
  29.                 if (mOkHttpHelperInstance == null) { 
  30.                     mOkHttpHelperInstance = new OkHttpHelper(); 
  31.                 } 
  32.             } 
  33.         }        return mOkHttpHelperInstance; 
  34.     }    /** 
  35.      * 封裝一個request方法,不管post或者get方法中都會用到 
  36.      */ 
  37.     public void request(final Request request, final BaseCallback callback) {        //在請求之前所做的事,比如彈出對話框等 
  38.         callback.onRequestBefore(); 
  39.  
  40.         mClientInstance.newCall(request).enqueue(new Callback() {             
  41.             @Override 
  42.             public void onFailure(Request request, IOException e) {                //返回失敗 
  43.                 callbackFailure(request, callback, e); 
  44.             }            @Override 
  45.             public void onResponse(Response response) throws IOException {                 
  46.                 if (response.isSuccessful()) {                    //返回成功回調 
  47.                     String resString = response.body().string();                     
  48.                 if (callback.mType == String.class) {                        //如果我們需要返回String類型 
  49.                         callbackSuccess(response, resString, callback); 
  50.                     } else {                        //如果返回的是其他類型,則利用Gson去解析 
  51.                         try { 
  52.                             Object o = mGson.fromJson(resString, callback.mType); 
  53.                             callbackSuccess(response, o, callback); 
  54.                         } catch (JsonParseException e) { 
  55.                             e.printStackTrace(); 
  56.                             callbackError(response, callback, e); 
  57.                         } 
  58.                     } 
  59.  
  60.                 } else {                    //返回錯誤 
  61.                     callbackError(response, callback, null); 
  62.                 } 
  63.             } 
  64.         }); 
  65.     }    /** 
  66.      * 在主線程中執行的回調 
  67.      * 
  68.      * @param response 
  69.      * @param resString 
  70.      * @param callback 
  71.      */ 
  72.     private void callbackSuccess(final Response response, final Object o, final BaseCallback callback) { 
  73.         mHandler.post(new Runnable() {             
  74.             @Override 
  75.             public void run() { 
  76.                 callback.onSuccess(response, o); 
  77.             } 
  78.         }); 
  79.     }    /** 
  80.      * 在主線程中執行的回調 
  81.      * @param response 
  82.      * @param callback 
  83.      * @param e 
  84.      */ 
  85.     private void callbackError(final Response response, final BaseCallback callback, final Exception e) { 
  86.         mHandler.post(new Runnable() {             
  87.             @Override 
  88.             public void run() { 
  89.                 callback.onError(response, response.code(), e); 
  90.             } 
  91.         }); 
  92.     }    /** 
  93.      * 在主線程中執行的回調 
  94.      * @param request 
  95.      * @param callback 
  96.      * @param e 
  97.      */ 
  98.     private void callbackFailure(final Request request, final BaseCallback callback, final Exception e) { 
  99.         mHandler.post(new Runnable() {             
  100.             @Override 
  101.             public void run() { 
  102.                 callback.onFailure(request, e); 
  103.             } 
  104.         }); 
  105.     }    /** 
  106.      * 對外公開的get方法 
  107.      * 
  108.      * @param url 
  109.      * @param callback 
  110.      */ 
  111.     public void get(String url, BaseCallback callback) { 
  112.         Request request = buildRequest(url, null, HttpMethodType.GET); 
  113.         request(request, callback); 
  114.     }    /** 
  115.      * 對外公開的post方法 
  116.      * 
  117.      * @param url 
  118.      * @param params 
  119.      * @param callback 
  120.      */ 
  121.     public void post(String url, Map<String, String> params, BaseCallback callback) { 
  122.         Request request = buildRequest(url, params, HttpMethodType.POST); 
  123.         request(request, callback); 
  124.     }    /** 
  125.      * 構建請求對象 
  126.      * 
  127.      * @param url 
  128.      * @param params 
  129.      * @param type 
  130.      * @return 
  131.      */ 
  132.     private Request buildRequest(String url, Map<String, String> params, HttpMethodType type) { 
  133.         Request.Builder builder = new Request.Builder(); 
  134.         builder.url(url);         
  135.             if (type == HttpMethodType.GET) { 
  136.             builder.get(); 
  137.         } else if (type == HttpMethodType.POST) { 
  138.             builder.post(buildRequestBody(params)); 
  139.         }        return builder.build(); 
  140.     }    /** 
  141.      * 通過Map的鍵值對構建請求對象的body 
  142.      * 
  143.      * @param params 
  144.      * @return 
  145.      */ 
  146.     private RequestBody buildRequestBody(Map<String, String> params) { 
  147.  
  148.         FormEncodingBuilder builder = new FormEncodingBuilder();         
  149.             if (params != null) {             
  150.                 for (Map.Entry<String, String> entity : params.entrySet()) { 
  151.                 builder.add(entity.getKey(), entity.getValue()); 
  152.             } 
  153.         }        return builder.build(); 
  154.     }    /** 
  155.      * 這個枚舉用于指明是哪一種提交方式 
  156.      */ 
  157.     enum HttpMethodType { 
  158.         GET, 
  159.         POST 
  160.     } 
  161.  
  162.  

回調的封裝

  1. package com.nan.cnshop.http; 
  2.  
  3. import com.google.gson.internal.$Gson$Types; 
  4. import com.squareup.okhttp.Request; 
  5. import com.squareup.okhttp.Response; 
  6.  
  7. import java.lang.reflect.ParameterizedType; 
  8. import java.lang.reflect.Type;/** 
  9.  * 基本的回調 
  10.  */public abstract class BaseCallback<T> {    /** 
  11.      * type用于方便JSON的解析 
  12.      */ 
  13.     public Type mType;    /** 
  14.      * 把type轉換成對應的類,這里不用看明白也行。 
  15.      * 
  16.      * @param subclass 
  17.      * @return 
  18.      */ 
  19.     static Type getSuperclassTypeParameter(Class<?> subclass) { 
  20.         Type superclass = subclass.getGenericSuperclass();         
  21.         if (superclass instanceof Class) {             
  22.             throw new RuntimeException("Missing type parameter."); 
  23.         } 
  24.         ParameterizedType parameterized = (ParameterizedType) superclass;         
  25.             return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); 
  26.     }    /** 
  27.      * 構造的時候獲得type的class 
  28.      */ 
  29.     public BaseCallback() { 
  30.         mType = getSuperclassTypeParameter(getClass()); 
  31.     }    /** 
  32.      * 請求之前調用 
  33.      */ 
  34.     public abstract void onRequestBefore();     
  35.      /** 
  36.      * 請求失敗調用(網絡問題) 
  37.      * 
  38.      * @param request 
  39.      * @param e 
  40.      */ 
  41.     public abstract void onFailure(Request request, Exception e);     
  42.      /** 
  43.      * 請求成功而且沒有錯誤的時候調用 
  44.      * 
  45.      * @param response 
  46.      * @param t 
  47.      */ 
  48.     public abstract void onSuccess(Response response, T t);     
  49.      /** 
  50.      * 請求成功但是有錯誤的時候調用,例如Gson解析錯誤等 
  51.      * 
  52.      * @param response 
  53.      * @param errorCode 
  54.      * @param e 
  55.      */ 
  56.     public abstract void onError(Response response, int errorCode, Exception e); 
  57.  
  58.  

OKHttp封裝之后的使用

如下面的代碼所示。首先得到OkHttpHelper的單例,然后調用get方法就可以了。由于繼承了Gson,因此需要在BaseCallback的泛型中傳入JSON對應的數據類型,筆者這里是List<Banner>。***在onSuccess方法中做我們想要做的事情就可以了。

  1. mHttpHelper=OkHttpHelper.getinstance(); 
  2. mHttpHelper.get(Constants.URL_BANNER, new BaseCallback<List<Banner>>() {     
  3.     @Override 
  4.     public void onRequestBefore() { 
  5.  
  6.     }    @Override 
  7.     public void onFailure(Request request, Exception e) { 
  8.  
  9.     }    @Override 
  10.     public void onSuccess(Response response, List<Banner> banners) { 
  11.         initBanners(banners); 
  12.     }    @Override 
  13.     public void onError(Response response, int errorCode, Exception e) { 
  14.  
  15.     } 
  16. });  

是不是覺得封裝之后OKHttp的使用變得很簡單呢,這就是封裝的強大之處,好了今天的筆記到此為止。

PS:這里只介紹了OKHttp的get和post使用介紹,其余的使用例如文件下載上傳以及對應的代碼封裝請自己去完成~(≧▽≦)/~啦啦啦。全文還有 BaseCallback 和 OkHttpHelper 的代碼,歡迎閱讀原文查看。 

責任編輯:龐桂玉 來源: 安卓巴士Android開發者門戶
相關推薦

2023-09-28 09:07:54

注解失效場景

2012-12-24 09:55:59

交換機網絡通信

2022-12-06 23:43:53

iOSCreateML應用

2013-04-15 09:48:40

AndroidAVD錯誤處理方法

2010-07-19 16:55:51

Telnet命令

2010-04-30 11:10:32

Oracle Sql

2021-12-09 09:52:36

云原生安全工具云安全

2018-07-30 08:20:39

編程語言Python集合

2010-04-23 09:51:12

Oracle工具

2023-07-17 06:57:16

2024-06-28 07:59:34

C#編程字段

2021-07-30 15:06:05

鴻蒙HarmonyOS應用

2021-08-24 23:23:35

Python工具開發

2022-09-09 20:55:38

LinkerdKubernetes

2023-03-01 14:32:31

redisIOEpoll

2025-05-12 04:00:01

2011-07-28 15:11:42

組策略

2018-08-09 08:00:00

Linux命令內存用量

2011-12-29 16:18:14

API

2010-03-10 11:45:15

云計算
點贊
收藏

51CTO技術棧公眾號

久久综合九色| 国产成人精品亚洲线观看| 国产精品久久久久aaaa樱花| 成人美女免费网站视频| 久久视频免费看| 伊人春色精品| 欧美精三区欧美精三区| 国产黄色片免费在线观看| 免费福利在线观看| 国产在线观看一区二区| 18性欧美xxxⅹ性满足| 国产精品suv一区二区88| 97精品久久| 精品1区2区3区| 国产精品裸体瑜伽视频| 男人在线资源站| 成人免费精品视频| 91精品在线播放| 美日韩一二三区| 亚洲乱码免费伦视频| 日韩h在线观看| 亚洲一区二区中文字幕在线观看| 日韩理论视频| 亚洲精品视频在线| 香蕉久久夜色| 男人的天堂在线| 国产盗摄精品一区二区三区在线| 国产精品第一视频| 91av在线免费视频| 欧美ab在线视频| 亚洲欧美制服丝袜| 国产一级二级在线观看| 日韩精品一区国产| 欧美视频自拍偷拍| 国产又黄又大又粗视频| 91九色国产在线播放| 亚洲欧美一区二区久久| 久久婷婷开心| 日本黄色三级视频| 国产精品1区2区3区| 国产精品爽爽ⅴa在线观看| 成人午夜淫片100集| 亚洲大胆视频| 欧美国产精品va在线观看| 国产在视频线精品视频| 国产精品自拍区| 日韩精品在线第一页| 五月天丁香社区| 日韩中文在线| 日韩欧美一区电影| 天天色天天干天天色| 国产高清日韩| 91精品国产综合久久香蕉麻豆| 中文字幕免费高清在线| 主播大秀视频在线观看一区二区| 色综合天天综合给合国产| 黄色一级视频片| 久久影院午夜精品| 亚欧色一区w666天堂| 91黄色在线看| ****av在线网毛片| 五月激情综合色| www..com日韩| 玖玖在线播放| 日本韩国一区二区| 国产又大又黄又粗的视频| 欧美三区四区| 欧美在线三级电影| 国内自拍第二页| 日韩精品久久久久久久软件91| 日韩欧美国产三级| 久久久久亚洲无码| 久久免费视频66| 亚洲精品在线视频| 18啪啪污污免费网站| 日韩欧美精品一区| 欧美精品一本久久男人的天堂| 久久伊人成人网| 99亚洲伊人久久精品影院红桃| 欧美怡红院视频一区二区三区| 无码人妻精品一区二区三区9厂 | 久久激情五月激情| 91免费在线视频| 亚洲精品免费在线观看视频| av午夜一区麻豆| 日本10禁啪啪无遮挡免费一区二区| 激情小视频在线| 亚洲欧洲三级电影| 青青草国产精品视频| 秋霞国产精品| 欧美成人精品福利| 亚洲av熟女国产一区二区性色| 日韩www.| 海角国产乱辈乱精品视频| 精品人妻一区二区三区潮喷在线 | 国产高清免费av| www.一区二区| 性欧美videosex高清少妇| 国产美女在线观看| 五月婷婷色综合| 国产 porn| 97品白浆高清久久久久久| 国产亚洲福利一区| 国产亚洲欧美精品久久久www| 午夜一区不卡| 91手机视频在线观看| 深夜视频在线免费| 亚洲欧美偷拍另类a∨色屁股| 免费国产黄色网址| 国产精品亚洲四区在线观看| 亚洲男人天堂网| 久久久久久久久久久久久女过产乱| 先锋a资源在线看亚洲| 亚洲自拍偷拍色片视频| 国产精品二线| 午夜伊人狠狠久久| 图片区乱熟图片区亚洲| 蜜桃视频欧美| 久久久久久久久久久av| 中文有码在线播放| 久久先锋资源网| 中国丰满熟妇xxxx性| 人人精品久久| 尤物tv国产一区| 国产又大又黄又粗| 成人自拍视频在线| 男女h黄动漫啪啪无遮挡软件| 午夜欧美巨大性欧美巨大| 亚洲精品一线二线三线| 青青操国产视频| 麻豆成人av在线| 日本在线观看一区二区| 国产美女高潮在线观看| 欧美一三区三区四区免费在线看| 摸摸摸bbb毛毛毛片| 一本久道久久综合婷婷鲸鱼| 国产精品theporn88| fc2ppv国产精品久久| 欧美调教femdomvk| 色噜噜噜噜噜噜| 久久久亚洲人| 免费亚洲一区二区| 在线观看网站免费入口在线观看国内| 亚洲成人xxx| 黄色激情视频在线观看| 成人夜色视频网站在线观看| 欧美黄色免费网址| 91国内精品| 久久久久久久97| 丰满熟妇乱又伦| 亚洲国产美国国产综合一区二区| 成年人看片网站| 午夜日韩福利| 国产精品二区在线观看| 美足av综合网| 亚洲成人在线视频播放| 亚欧视频在线观看| 久久新电视剧免费观看| 日韩av一二三四| 不卡一区2区| 国产日韩精品在线播放| 美女隐私在线观看| 日韩欧美区一区二| 国产精品999久久久| 91香蕉视频mp4| 成人在线观看a| 日本不卡免费一区| 91牛牛免费视频| 日本大片在线播放| 日韩成人激情在线| 一级片在线免费播放| 国产精品久久久久永久免费观看| 五月花丁香婷婷| 国产精品chinese| 精品免费国产| 国产精品亚洲一区二区三区在线观看 | 欧美激情一二区| 欧美一区二区少妇| 欧美乱熟臀69xxxxxx| wwwav国产| 99麻豆久久久国产精品免费| 国产裸体免费无遮挡| 亚洲va在线| 国严精品久久久久久亚洲影视 | 99精品视频国产| 亚洲精品123区| 日韩欧美第二区在线观看| 亚洲三级电影| 97av在线播放| 日韩精品黄色| 亚洲第一网站男人都懂| 最好看的日本字幕mv视频大全| 亚洲视频在线观看三级| 免费的av网站| 麻豆91在线看| 日本欧美视频在线观看| 色综合久久一区二区三区| 国产精品亚洲不卡a| 日韩电影毛片| 久久av在线看| 黄色国产在线| 欧美成人欧美edvon| 日韩免费av网站| 樱桃国产成人精品视频| 国产又粗又猛又爽又黄av| 国产成人综合精品三级| 中文字幕第80页| 亚洲精品在线二区| 成人性做爰片免费视频| 蜜桃成人av| 国产精品久久久久久久天堂第1集| yy6080久久伦理一区二区| 久久男人av资源网站| 色综合久久影院| 日韩久久免费视频| 亚洲精品18p| 欧美挠脚心视频网站| 国产精品suv一区| 亚洲一二三级电影| 国产色无码精品视频国产| 久久综合成人精品亚洲另类欧美| 久久久久亚洲AV成人网人人小说| 久久精品国产99国产| 免费在线a视频| 一区视频在线| 欧美性猛交内射兽交老熟妇| 不卡在线一区二区| 日本一区不卡| 亚洲宅男网av| 九色91在线视频| 嗯用力啊快一点好舒服小柔久久| 亚洲精品欧美日韩专区| 欧美激情三区| 国产精品香蕉av| 成人精品三级| 国产精品99久久久久久www | 91性高湖久久久久久久久_久久99| 亚洲少妇视频| 69视频在线免费观看| 黄色污污视频在线观看| 久久影视电视剧免费网站| av在线播放免费| 亚洲人成网在线播放| 四虎精品在线| 亚洲激情视频网站| 国产91麻豆视频| 精品国产麻豆免费人成网站| 午夜精品在线播放| 日韩亚洲欧美中文三级| 国产麻豆免费观看| 日韩欧美专区在线| 精品免费久久久| 欧美成人r级一区二区三区| www久久久com| 亚洲二区在线播放视频| 日韩一级片免费| 精品亚洲男同gayvideo网站| 视频在线不卡| 国产亚洲精品久久久久动| 福利视频在线播放| 日韩在线视频国产| 在线观看操人| 久久久久久成人| 理论不卡电影大全神| 欧美中文在线字幕| 日韩毛片一区| 91欧美激情另类亚洲| 第四色在线一区二区| 久久久久久久久久久久久9999| 国语产色综合| 制服丝袜综合日韩欧美| 欧美日本三区| 日韩av资源在线| 蜜桃视频一区二区| 毛毛毛毛毛毛毛片123| av午夜一区麻豆| 国产午夜精品久久久久久久久| 亚洲少妇30p| 国产午夜精品无码一区二区| 日韩欧美一区二区三区久久| 中文字幕 国产| 欧美一区三区四区| 天堂在线中文资源| 在线播放日韩av| 最近中文字幕免费mv2018在线| 国外成人在线视频| 亚洲日本在线观看视频| 成人激情视频在线| 美女网站色精品尤物极品姐弟| 日本一区免费看| 亚洲老妇激情| 99热成人精品热久久66| 国内成人自拍视频| 国产国语性生话播放| 中文字幕一区二区三区在线不卡| 国产精品成人免费一区二区视频| 色综合久久综合中文综合网| 国产乱淫a∨片免费视频| 国产视频精品久久久| 成视频免费观看在线看| 欧美在线视频导航| 欧美一区一区| 日韩av一区二区三区在线| 狠狠综合久久| 在线观看国产中文字幕| 91丝袜美腿高跟国产极品老师 | 国产成人精品久久二区二区| www.久久草.com| 欧美在线播放一区| 一区视频在线| 国产精品久久久久久久99| 久久久美女毛片| 国产一级免费观看| 3d动漫精品啪啪1区2区免费| 色视频在线观看| 欧美国产日韩一区| 亚洲爽爆av| 香蕉久久夜色| 丝袜美腿亚洲色图| 噜噜噜在线视频| 亚洲国产视频一区二区| 国产精品久久久久久久久毛片 | www.成人av| 97精品一区| 啊啊啊国产视频| 26uuu国产在线精品一区二区| 免费日韩在线视频| 欧美精品123区| 国产福利免费在线观看| 日韩免费高清在线观看| 欧美亚视频在线中文字幕免费| 欧美日韩dvd| 国产一区二区三区在线观看精品 | 一区二区三区在线视频观看| 夜夜躁狠狠躁日日躁av| 国产午夜精品免费一区二区三区| 蜜桃视频在线观看播放| 国产偷久久久精品专区| 国语对白精品一区二区| 中文字幕在线视频一区二区| 日韩一区中文字幕| 夜夜狠狠擅视频| 久久天天躁狠狠躁夜夜躁2014| 国产精品亚洲成在人线| 天堂资源在线亚洲资源| 青青草97国产精品免费观看 | 国产精品一在线观看| 欧美性大战久久久久xxx | 欧美一区二区在线不卡| 男人天堂久久久| 亚洲一区制服诱惑| 综合久久久久| 波多野结衣办公室双飞 | 欧美日韩福利在线| 成人av免费观看| 日韩精品在线免费看| 精品小视频在线| 2019年精品视频自拍| 影音先锋亚洲视频| 国产精品一区二区视频| 久一区二区三区| 亚洲精品视频网上网址在线观看| 桃花岛tv亚洲品质| 一本一道久久久a久久久精品91 | 国产精品日韩专区| 国产精品91一区二区三区| 手机在线免费毛片| 亚洲国产成人av| 黄色av网址在线免费观看| 国产精品日韩一区| 亚洲影视一区| 亚洲最大的黄色网| 欧美在线视频日韩| aa在线视频| 久久青青草原| 九九国产精品视频| 中文字幕第28页| 亚洲日韩中文字幕在线播放| 欧美jizz18| 久久国产精品网| 欧美高清在线一区二区| 国产99久一区二区三区a片| 久久久亚洲国产| 国产欧美一区| 日韩欧美色视频| 欧美日韩亚洲天堂| 麻豆免费在线观看| 久久国产精品亚洲va麻豆| 蜜桃视频一区二区三区| 日本少妇激情视频| 深夜精品寂寞黄网站在线观看| 一区二区三区国产好| 成年人视频在线免费| 欧美日韩五区| 日本一区二区三区www| 国产中文字幕一区| 中文字幕精品三级久久久| 日韩视频免费在线观看| 久久中文资源| theporn国产精品|