伊人久久大香线蕉综合影视_日韩精品少妇无码受不了_71pao成人国产永久免费视频_国产伦片中文免费观看_国产高清无码麻豆精品_九色综合伊人久久富二代_日韩黄色精品_日韩A∨精品日韩精品无码

Retrofit源碼分析

2018-9-3    seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

1、簡介

retrofit是一個(gè)封裝okhttp請(qǐng)求的網(wǎng)絡(luò)請(qǐng)求庫,可以通過Rxjava適配返回信息。

2、原理分析

我們通過Retrofit.Builder建造者模式創(chuàng)建一個(gè)Retrofit實(shí)例對(duì)象

public static final class Builder {
    /**
      *Android線程切換的類 
      */
    private final Platform platform;
    private @Nullable okhttp3.Call.Factory callFactory;
    private HttpUrl baseUrl;
    private final List<Converter.Factory> converterFactories = new ArrayList<>();
    private final List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>();
    private @Nullable Executor callbackExecutor;
    private boolean validateEagerly;

    Builder(Platform platform) {
      this.platform = platform;
    }

    public Builder() {
      this(Platform.get());
    }

    Builder(Retrofit retrofit) {
      platform = Platform.get();
      callFactory = retrofit.callFactory;
      baseUrl = retrofit.baseUrl;

      converterFactories.addAll(retrofit.converterFactories);
      // Remove the default BuiltInConverters instance added by build().
      converterFactories.remove(0);

      callAdapterFactories.addAll(retrofit.callAdapterFactories);
      // Remove the default, platform-aware call adapter added by build().
      callAdapterFactories.remove(callAdapterFactories.size() - 1);

      callbackExecutor = retrofit.callbackExecutor;
      validateEagerly = retrofit.validateEagerly;
    }

    public Builder client(OkHttpClient client) {
      return callFactory(checkNotNull(client, "client == null"));
    }

    public Builder callFactory(okhttp3.Call.Factory factory) {
      this.callFactory = checkNotNull(factory, "factory == null");
      return this;
    }

    public Builder baseUrl(String baseUrl) {
      checkNotNull(baseUrl, "baseUrl == null");
      HttpUrl httpUrl = HttpUrl.parse(baseUrl);
      if (httpUrl == null) {
        throw new IllegalArgumentException("Illegal URL: " + baseUrl);
      }
      return baseUrl(httpUrl);
    }

    public Builder baseUrl(HttpUrl baseUrl) {
      checkNotNull(baseUrl, "baseUrl == null");
      List<String> pathSegments = baseUrl.pathSegments();
      if (!"".equals(pathSegments.get(pathSegments.size() - 1))) {
        throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);
      }
      this.baseUrl = baseUrl;
      return this;
    }

    public Builder addConverterFactory(Converter.Factory factory) {
      converterFactories.add(checkNotNull(factory, "factory == null"));
      return this;
    }

    public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
      callAdapterFactories.add(checkNotNull(factory, "factory == null"));
      return this;
    }

    public Builder callbackExecutor(Executor executor) {
      this.callbackExecutor = checkNotNull(executor, "executor == null");
      return this;
    }

    public List<CallAdapter.Factory> callAdapterFactories() {
      return this.callAdapterFactories;
    }

    public List<Converter.Factory> converterFactories() {
      return this.converterFactories;
    }

    public Builder validateEagerly(boolean validateEagerly) {
      this.validateEagerly = validateEagerly;
      return this;
    }

    public Retrofit build() {
      if (baseUrl == null) {
        throw new IllegalStateException("Base URL required.");
      }

      okhttp3.Call.Factory callFactory = this.callFactory;
      if (callFactory == null) {
        callFactory = new OkHttpClient();
      }

      Executor callbackExecutor = this.callbackExecutor;
      if (callbackExecutor == null) {
        callbackExecutor = platform.defaultCallbackExecutor();
      }

      // Make a defensive copy of the adapters and add the default Call adapter.
      List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
      callAdapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

      // Make a defensive copy of the converters.
      List<Converter.Factory> converterFactories =
          new ArrayList<>(1 + this.converterFactories.size());

      // Add the built-in converter factory first. This prevents overriding its behavior but also
      // ensures correct behavior when using converters that consume all types.
      converterFactories.add(new BuiltInConverters());
      converterFactories.addAll(this.converterFactories);

      return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
          unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
    }
 } 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129

通過Retrofit.Builder中build方法創(chuàng)建一個(gè)Retrofit實(shí)例對(duì)象,在創(chuàng)建Retrofit時(shí)會(huì)判斷用戶創(chuàng)建OkhttpClient對(duì)象,沒有創(chuàng)建Retrofit會(huì)創(chuàng)建一個(gè)默認(rèn)okhttpClient對(duì)象,然后設(shè)置Platform中的主線程線程池,設(shè)置線程池處理器交給主線程Looper對(duì)象。然后創(chuàng)建一個(gè)Retrofit對(duì)象。我們通過Retrofit.create創(chuàng)建一個(gè)接口代理類

 public <T> T create(final Class<T> service) {
    Utils.validateServiceInterface(service);
    if (validateEagerly) {
      eagerlyValidateMethods(service);
    }
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();

          @Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
              throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
            if (method.getDeclaringClass() == Object.class) {
              return method.invoke(this, args);
            }
            if (platform.isDefaultMethod(method)) {
              return platform.invokeDefaultMethod(method, service, proxy, args);
            }
            ServiceMethod<Object, Object> serviceMethod =
                (ServiceMethod<Object, Object>) loadServiceMethod(method);
            OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
            return serviceMethod.adapt(okHttpCall);
          }
        });
  } 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在調(diào)用Creater方法時(shí),通過代理類創(chuàng)建Service實(shí)例對(duì)象,當(dāng)我們通過接口實(shí)例對(duì)象調(diào)用方法時(shí),通過invoke方法時(shí),通過Method創(chuàng)建一個(gè)ServiceMethod對(duì)象,然后把ServiceMethod存儲(chǔ)起來

 public ServiceMethod build() {
          callAdapter = createCallAdapter();
          responseType = callAdapter.responseType();
          if (responseType == Response.class || responseType == okhttp3.Response.class) {
            throw methodError("'"
                + Utils.getRawType(responseType).getName()
                + "' is not a valid response body type. Did you mean ResponseBody?");
          }
          responseConverter = createResponseConverter();

          for (Annotation annotation : methodAnnotations) {
            parseMethodAnnotation(annotation);
          }

          if (httpMethod == null) {
            throw methodError("HTTP method annotation is required (e.g., @GET, @POST, etc.).");
          }

          if (!hasBody) {
            if (isMultipart) {
              throw methodError(
                  "Multipart can only be specified on HTTP methods with request body (e.g., @POST).");
            }
            if (isFormEncoded) {
              throw methodError("FormUrlEncoded can only be specified on HTTP methods with "
                  + "request body (e.g., @POST).");
            }
          }

          int parameterCount = parameterAnnotationsArray.length;
          parameterHandlers = new ParameterHandler<?>[parameterCount];
          for (int p = 0; p < parameterCount; p++) {
            Type parameterType = parameterTypes[p];
            if (Utils.hasUnresolvableType(parameterType)) {
              throw parameterError(p, "Parameter type must not include a type variable or wildcard: %s",
                  parameterType);
            }

            Annotation[] parameterAnnotations = parameterAnnotationsArray[p];
            if (parameterAnnotations == null) {
              throw parameterError(p, "No Retrofit annotation found.");
            }

            parameterHandlers[p] = parseParameter(p, parameterType, parameterAnnotations);
          }

          if (relativeUrl == null && !gotUrl) {
            throw methodError("Missing either @%s URL or @Url parameter.", httpMethod);
          }
          if (!isFormEncoded && !isMultipart && !hasBody && gotBody) {
            throw methodError("Non-body HTTP method cannot contain @Body.");
          }
          if (isFormEncoded && !gotField) {
            throw methodError("Form-encoded method must contain at least one @Field.");
          }
          if (isMultipart && !gotPart) {
            throw methodError("Multipart method must contain at least one @Part.");
          }

          return new ServiceMethod<>(this);
        }

    private CallAdapter<T, R> createCallAdapter() {
            /**
             *獲取方法返回值類型
             */
          Type returnType = method.getGenericReturnType();
          if (Utils.hasUnresolvableType(returnType)) {
            throw methodError(
                "Method return type must not include a type variable or wildcard: %s", returnType);
          }
          if (returnType == void.class) {
            throw methodError("Service methods cannot return void.");
          }
          //獲取注解信息
          Annotation[] annotations = method.getAnnotations();
          try {
            //noinspection unchecked
            return (CallAdapter<T, R>) retrofit.callAdapter(returnType, annotations);
          } catch (RuntimeException e) { // Wide exception range because factories are user code.
            throw methodError(e, "Unable to create call adapter for %s", returnType);
          }
        } 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

在創(chuàng)建ServiceMethod時(shí),獲取我們okhttp請(qǐng)求是否有返回值,沒有返回值拋出異常,然后獲取注解信息,然后獲取retrofit中CallAdapter.Factory,然后調(diào)用get方法,我們在通過rxjavaFactoryAdapter.create創(chuàng)建的就是實(shí)現(xiàn)CallAdapter.Factory對(duì)象,然后調(diào)用CallAdapter.Factory中respenseType方法,然后通過我們傳遞converter對(duì)數(shù)據(jù)進(jìn)行序列化,可以通過gson和fastjson進(jìn)行實(shí)例化對(duì)象,然后通過parseMethodAnnomation解析請(qǐng)求類型

 private void parseHttpMethodAndPath(String httpMethod, String value, boolean hasBody) {
          if (this.httpMethod != null) {
            throw methodError("Only one HTTP method is allowed. Found: %s and %s.",
                this.httpMethod, httpMethod);
          }
          this.httpMethod = httpMethod;
          this.hasBody = hasBody;

          if (value.isEmpty()) {
            return;
          }

          // Get the relative URL path and existing query string, if present.
          int question = value.indexOf('?');
          if (question != -1 && question < value.length() - 1) {
            // Ensure the query string does not have any named parameters.
            String queryParams = value.substring(question + 1);
            Matcher queryParamMatcher = PARAM_URL_REGEX.matcher(queryParams);
            if (queryParamMatcher.find()) {
              throw methodError("URL query string \"%s\" must not have replace block. "
                  + "For dynamic query parameters use @Query.", queryParams);
            }
          }

          this.relativeUrl = value;
          this.relativeUrlParamNames = parsePathParameters(value);
        } 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

通過注解類型獲取到請(qǐng)求類型時(shí),通過調(diào)用相關(guān)方法解析獲取到請(qǐng)求url,然后通過注解獲取方法中是否有注解字段,有注解信息存儲(chǔ)到Set集合中。然后創(chuàng)建一個(gè)OkhttpCall對(duì)象,通過調(diào)用serviceMethod.adapt方法做網(wǎng)絡(luò)請(qǐng)求,serviceMethod.adapt調(diào)用是callAdapter中的adapt方法,如果用戶沒有設(shè)置callAdapter模式使用的是ExecutorCallAdapterFactory中的adapt方法

 public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
            if (getRawType(returnType) != Call.class) {
                return null;
            } else {
                final Type responseType = Utils.getCallResponseType(returnType);
                return new CallAdapter<Object, Call<?>>() {
                    public Type responseType() {
                        return responseType;
                    }

                    public Call<Object> adapt(Call<Object> call) {
                        return new ExecutorCallAdapterFactory.ExecutorCallbackCall(ExecutorCallAdapterFactory.this.callbackExecutor, call);
                    }
                };
            }
        } 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在ExectorCallAdapterFactory中調(diào)用組裝的Call方法中enqueue方法調(diào)用異步網(wǎng)絡(luò)請(qǐng)求,成功后通過Platform中MainThreadExecutor切換到主線程。在調(diào)用callback中的enqueue,onResponse和onFairlure方法時(shí)實(shí)際是調(diào)用到OkhttpCall方法的onResponse方法,在OkHttpCall.enqueue中重新組建OkHttp.Call url和參數(shù)信息,然后封裝請(qǐng)求,請(qǐng)求成功后通過parseResponse解析返回信息狀態(tài),然后把返回信息狀態(tài)成ResponseBody對(duì)象,調(diào)用ServiceMethod.toResponse解析,在toResponse中實(shí)際是我們設(shè)置ConverterFactory對(duì)象解析數(shù)據(jù),完成后調(diào)用callBack中onSuccess方法。

 @Override public void enqueue(final Callback<T> callback) {
        checkNotNull(callback, "callback == null");

        okhttp3.Call call;
        Throwable failure;

        synchronized (this) {
          if (executed) throw new IllegalStateException("Already executed.");
          executed = true;

          call = rawCall;
          failure = creationFailure;
          if (call == null && failure == null) {
            try {
              call = rawCall = createRawCall();
            } catch (Throwable t) {
              throwIfFatal(t);
              failure = creationFailure = t;
            }
          }
        }

        if (failure != null) {
          callback.onFailure(this, failure);
          return;
        }

        if (canceled) {
          call.cancel();
        }

        call.enqueue(new okhttp3.Callback() {
          @Override public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse) {
            Response<T> response;
            try {
              response = parseResponse(rawResponse);
            } catch (Throwable e) {
              callFailure(e);
              return;
            }

            try {
              callback.onResponse(OkHttpCall.this, response);
            } catch (Throwable t) {
              t.printStackTrace();
            }
          }

          @Override public void onFailure(okhttp3.Call call, IOException e) {
            callFailure(e);
          }

          private void callFailure(Throwable e) {
            try {
              callback.onFailure(OkHttpCall.this, e);
            } catch (Throwable t) {
              t.printStackTrace();
            }
          }
        });
      }
藍(lán)藍(lán)設(shè)計(jì)www.cqzjtgb.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。

日歷

鏈接

個(gè)人資料

存檔

午夜激情福利司机影院| 国产毛片a区久久久久| 伊人久久精品亚洲午夜| 精品国产一区二区三区久久久樱花 | 国产在视频线在精品| 老师上课跳d突然被开到最大视频| 秋霞伦理黄片| www.av在线官网国产| 国内精品美女久久久久久| 亚洲精品,欧美精品| 日韩一本色道免费dvd| 人人妻人人澡欧美一区二区| 五月玫瑰六月丁香| 国产成人a∨麻豆精品| videossex国产| 亚洲国产欧洲综合997久久,| 波多野结衣高清无吗| 久久久久免费精品人妻一区二区| 欧美+日韩+精品| 亚洲性久久影院| 欧美激情久久久久久爽电影| 看黄色毛片网站| 青春草国产在线视频| 国产日韩欧美在线精品| 大又大粗又爽又黄少妇毛片口| 国产白丝娇喘喷水9色精品| 成人毛片a级毛片在线播放| 2022亚洲国产成人精品| 国产精品国产三级国产av玫瑰| 激情 狠狠 欧美| 免费搜索国产男女视频| 日韩一区二区三区影片| 欧美97在线视频| 国产高清不卡午夜福利| 欧美日韩综合久久久久久| 亚洲精品日韩av片在线观看| 色综合站精品国产| 国模一区二区三区四区视频| 欧美性猛交黑人性爽| 中文字幕熟女人妻在线| 国模一区二区三区四区视频| 狂野欧美白嫩少妇大欣赏| 99久久成人亚洲精品观看| kizo精华| 亚洲色图av天堂| 麻豆久久精品国产亚洲av| 国产三级中文精品| 亚洲精品日韩av片在线观看| 我的女老师完整版在线观看| 成人特级av手机在线观看| 18禁裸乳无遮挡免费网站照片| 青春草国产在线视频| 久久精品久久久久久久性| 亚洲国产精品久久男人天堂| 国产乱来视频区| 99久久人妻综合| 国产高清三级在线| 国产免费又黄又爽又色| 看十八女毛片水多多多| 成人毛片60女人毛片免费| 日本午夜av视频| 亚洲综合色惰| 免费观看人在逋| 一级毛片我不卡| 三级毛片av免费| 亚洲av不卡在线观看| 精品99又大又爽又粗少妇毛片| 亚洲在线观看片| 久久精品国产亚洲av涩爱| 亚洲成人av在线免费| 午夜福利网站1000一区二区三区| 国产高清不卡午夜福利| 国产精品人妻久久久影院| 九九在线视频观看精品| 日本黄色视频三级网站网址| 久久精品人妻少妇| 床上黄色一级片| 免费播放大片免费观看视频在线观看 | 看十八女毛片水多多多| 亚洲成人av在线免费| 国产一区二区三区av在线| 91久久精品国产一区二区三区| 国语对白做爰xxxⅹ性视频网站| 久久久久性生活片| 又黄又爽又刺激的免费视频.| 久久精品国产亚洲av涩爱| 边亲边吃奶的免费视频| 搡女人真爽免费视频火全软件| 国产成人精品婷婷| 91在线精品国自产拍蜜月| 国语对白做爰xxxⅹ性视频网站| 午夜激情欧美在线| av黄色大香蕉| 中文资源天堂在线| 黄色日韩在线| 黄片wwwwww| 男女边吃奶边做爰视频| 91精品伊人久久大香线蕉| 国产淫片久久久久久久久| 亚洲美女搞黄在线观看| 国产精品乱码一区二三区的特点| 2021天堂中文幕一二区在线观| 最近最新中文字幕免费大全7| 日韩成人av中文字幕在线观看| 精品无人区乱码1区二区| 男女那种视频在线观看| 日本免费在线观看一区| 精品久久久久久电影网 | 国产91av在线免费观看| av在线亚洲专区| 午夜福利在线观看免费完整高清在| 国语自产精品视频在线第100页| 寂寞人妻少妇视频99o| 国产精品久久久久久久电影| 国产免费福利视频在线观看| 日韩av在线免费看完整版不卡| 自拍偷自拍亚洲精品老妇| 亚洲精品成人久久久久久| 日韩制服骚丝袜av| 亚洲国产欧美在线一区| 成年女人永久免费观看视频| 超碰av人人做人人爽久久| 卡戴珊不雅视频在线播放| 午夜老司机福利剧场| 麻豆成人午夜福利视频| 色视频www国产| 久久精品国产亚洲av天美| 国产成人精品一,二区| 少妇的逼水好多| 搞女人的毛片| 三级男女做爰猛烈吃奶摸视频| 日本-黄色视频高清免费观看| 天天躁夜夜躁狠狠久久av| 精品人妻视频免费看| 亚洲国产精品专区欧美| 久久精品影院6| 偷拍熟女少妇极品色| 亚洲精品影视一区二区三区av| 亚洲av免费高清在线观看| 最近的中文字幕免费完整| 婷婷色av中文字幕| 国产av一区在线观看免费| 精品国内亚洲2022精品成人| 国产精品人妻久久久久久| 国产精品.久久久| 精品一区二区三区人妻视频| 人人妻人人澡欧美一区二区| 搡女人真爽免费视频火全软件| 国产亚洲91精品色在线| 男女国产视频网站| 日本av手机在线免费观看| 午夜福利在线观看吧| av女优亚洲男人天堂| 免费看av在线观看网站| 99久久人妻综合| 啦啦啦韩国在线观看视频| 一级毛片aaaaaa免费看小| 久久久欧美国产精品| 亚洲国产精品合色在线| 日本黄色视频三级网站网址| 亚洲精品亚洲一区二区| 免费播放大片免费观看视频在线观看 | 国产精品无大码| 日本wwww免费看| 亚洲av成人av| 我要搜黄色片| 男插女下体视频免费在线播放| 中文字幕精品亚洲无线码一区| 超碰av人人做人人爽久久| 国产高清视频在线观看网站| 最近视频中文字幕2019在线8| 亚洲国产精品成人综合色| 男人和女人高潮做爰伦理| a级毛色黄片| 99久久成人亚洲精品观看| www.av在线官网国产| 欧美一区二区精品小视频在线| 黑人高潮一二区| 国国产精品蜜臀av免费| 岛国在线免费视频观看| 老司机影院成人| 亚洲精品456在线播放app| 国产高清三级在线| 国产伦在线观看视频一区| 九九在线视频观看精品| 国产三级中文精品| 久久久成人免费电影| 欧美性猛交黑人性爽| 欧美成人a在线观看| 国产精品一区www在线观看| 久久久久久久国产电影| av专区在线播放| 三级经典国产精品| 日韩av在线免费看完整版不卡| 亚洲欧洲国产日韩| 成人特级av手机在线观看| 嫩草影院入口| 中文字幕精品亚洲无线码一区| 尤物成人国产欧美一区二区三区| 欧美高清成人免费视频www| 精品酒店卫生间| 91午夜精品亚洲一区二区三区| 国内揄拍国产精品人妻在线| 亚洲自偷自拍三级| 精品免费久久久久久久清纯| 老司机影院成人| 成人亚洲精品av一区二区| 伦精品一区二区三区| 欧美一区二区精品小视频在线| 国产私拍福利视频在线观看| 欧美激情在线99| 国产精品伦人一区二区| 大又大粗又爽又黄少妇毛片口| 亚洲最大成人中文| 一区二区三区高清视频在线| 国产不卡一卡二| 男女边吃奶边做爰视频| 国产精品久久久久久av不卡| 99热这里只有是精品在线观看| 亚洲在线观看片| 国产精品一区二区在线观看99 | av在线亚洲专区| av在线蜜桃| 日本wwww免费看| 免费观看人在逋| 亚洲欧美一区二区三区国产| 乱码一卡2卡4卡精品| 亚洲,欧美,日韩| 日本免费一区二区三区高清不卡| 亚洲综合色惰| 最近手机中文字幕大全| 免费观看精品视频网站| 亚洲精品亚洲一区二区| 亚洲av一区综合| 蜜桃久久精品国产亚洲av| 精品一区二区三区人妻视频| 精华霜和精华液先用哪个| 一级毛片我不卡| a级一级毛片免费在线观看| 久久欧美精品欧美久久欧美| 日韩av在线大香蕉| 亚洲av电影不卡..在线观看| 国产熟女欧美一区二区| 97在线视频观看| 桃色一区二区三区在线观看| 色网站视频免费| 七月丁香在线播放| 日韩一区二区三区影片| 国产白丝娇喘喷水9色精品| 爱豆传媒免费全集在线观看| 久久精品国产亚洲网站| h日本视频在线播放| 久久国产乱子免费精品| 日日干狠狠操夜夜爽| 国产综合懂色| av福利片在线观看| 一边亲一边摸免费视频| 亚洲四区av| 最近最新中文字幕大全电影3| 国产成人精品久久久久久| 美女xxoo啪啪120秒动态图| 国产精品久久电影中文字幕| 美女脱内裤让男人舔精品视频| 97在线视频观看| 国产91av在线免费观看| 久久精品91蜜桃| 深爱激情五月婷婷| 中文在线观看免费www的网站| av在线观看视频网站免费| 一区二区三区乱码不卡18| 亚洲人成网站在线观看播放| 97人妻精品一区二区三区麻豆| 18禁在线播放成人免费| 成人二区视频| 久久久久国产网址| 日韩大片免费观看网站 | 免费黄网站久久成人精品| 欧美最新免费一区二区三区| 99久久中文字幕三级久久日本| 国产在视频线精品| 国产淫语在线视频| 亚洲精品亚洲一区二区| 欧美性感艳星| 午夜福利成人在线免费观看| 成人亚洲欧美一区二区av| 国产男人的电影天堂91| 非洲黑人性xxxx精品又粗又长| 欧美人与善性xxx| eeuss影院久久| 男插女下体视频免费在线播放| 日韩欧美在线乱码| 黄片无遮挡物在线观看| 视频中文字幕在线观看| 大香蕉97超碰在线| 国产精品人妻久久久久久| 美女国产视频在线观看| 啦啦啦啦在线视频资源| 美女脱内裤让男人舔精品视频| 欧美一区二区国产精品久久精品| 国产精品伦人一区二区| 欧美日韩综合久久久久久| 久久人人爽人人爽人人片va| 亚洲欧美一区二区三区国产| 搞女人的毛片| 天堂√8在线中文| 一卡2卡三卡四卡精品乱码亚洲| 纵有疾风起免费观看全集完整版 | 国产精品久久久久久精品电影| 男人和女人高潮做爰伦理| 国产免费男女视频| av又黄又爽大尺度在线免费看 | 欧美人与善性xxx| 日韩中字成人| 性色avwww在线观看| av专区在线播放| 日韩中字成人| 18禁裸乳无遮挡免费网站照片| 成人欧美大片| 国产一区二区三区av在线| 成人午夜高清在线视频| 久久久精品大字幕| 亚洲精品,欧美精品| 久久韩国三级中文字幕| 国产成人a区在线观看| 午夜福利在线在线| 成人漫画全彩无遮挡| 韩国av在线不卡| 人体艺术视频欧美日本| 97在线视频观看| 国产v大片淫在线免费观看| 国产午夜福利久久久久久| 99九九线精品视频在线观看视频| 成年免费大片在线观看| 欧美激情久久久久久爽电影| 丰满人妻一区二区三区视频av| 中文字幕精品亚洲无线码一区| 国产精品.久久久| 中文精品一卡2卡3卡4更新| 在现免费观看毛片| 内射极品少妇av片p| 免费av毛片视频| 免费看av在线观看网站| av在线蜜桃| 亚洲av熟女| 波多野结衣巨乳人妻| 午夜a级毛片| 久久精品夜色国产| .国产精品久久| 欧美激情国产日韩精品一区| 欧美日韩精品成人综合77777| 在线免费十八禁| 一个人看的www免费观看视频| 麻豆国产97在线/欧美| 亚洲久久久久久中文字幕| 纵有疾风起免费观看全集完整版 | 日韩精品青青久久久久久| 亚洲国产精品成人综合色| 亚洲图色成人| 国产乱人偷精品视频| 国产成人精品久久久久久| av在线天堂中文字幕| 欧美3d第一页| av天堂中文字幕网| 激情 狠狠 欧美| 观看免费一级毛片| 中文天堂在线官网| 免费观看性生交大片5| 国产 一区 欧美 日韩| 亚洲国产精品sss在线观看| 亚洲精品国产av成人精品| 18+在线观看网站| 国内揄拍国产精品人妻在线| 国产黄色视频一区二区在线观看 | 国产成年人精品一区二区| 韩国高清视频一区二区三区| 国产av码专区亚洲av| 超碰av人人做人人爽久久| 夜夜爽夜夜爽视频| 26uuu在线亚洲综合色| 乱系列少妇在线播放| 在线a可以看的网站| 日韩强制内射视频| 国产 一区 欧美 日韩| 深夜a级毛片| 熟女人妻精品中文字幕| 色综合色国产| 久久久久久久午夜电影| 亚洲精品一区蜜桃| 97人妻精品一区二区三区麻豆| 人妻少妇偷人精品九色| av福利片在线观看| 国产精品女同一区二区软件| 国产成人精品一,二区| 少妇被粗大猛烈的视频| 乱系列少妇在线播放| 国产高清不卡午夜福利| 一级二级三级毛片免费看| 在线播放国产精品三级| 神马国产精品三级电影在线观看| 精品久久久久久久末码| 亚洲国产日韩欧美精品在线观看| 久久久久久久久久黄片| 久久久久久久国产电影| 国产精品国产三级专区第一集| 最近手机中文字幕大全| 国产精品国产高清国产av| 丰满乱子伦码专区| 老女人水多毛片| 国产一区二区在线观看日韩| 亚洲欧美一区二区三区国产| 你懂的网址亚洲精品在线观看 | 黄色配什么色好看| 91久久精品国产一区二区三区| 国产色婷婷99| 日韩制服骚丝袜av| 亚洲精品456在线播放app| 日韩人妻高清精品专区| 国产精品久久久久久av不卡| 国产成人一区二区在线| 精品久久久久久久久av| 亚洲av成人精品一区久久| 热99在线观看视频| 成人二区视频| 波多野结衣高清无吗| 成人av在线播放网站| 亚洲中文字幕一区二区三区有码在线看| 成人午夜高清在线视频| 精品国产一区二区三区久久久樱花 | 中文字幕免费在线视频6| 最新中文字幕久久久久| 最近最新中文字幕大全电影3| 久久精品影院6| 欧美高清成人免费视频www| 午夜亚洲福利在线播放| 夫妻性生交免费视频一级片| 日本欧美国产在线视频| 天天躁夜夜躁狠狠久久av| 麻豆av噜噜一区二区三区| 最近中文字幕2019免费版| 床上黄色一级片| 秋霞伦理黄片| 一夜夜www| av福利片在线观看| 国产真实乱freesex| 国产亚洲5aaaaa淫片| 国产精品蜜桃在线观看| 美女黄网站色视频| 久久久久久久久中文| 一夜夜www| 夫妻性生交免费视频一级片| 精品一区二区三区视频在线| av播播在线观看一区| 成年av动漫网址| 亚洲一级一片aⅴ在线观看| 国产探花在线观看一区二区| 国产精品女同一区二区软件| 免费av不卡在线播放| 好男人视频免费观看在线| 国内精品美女久久久久久| 热99re8久久精品国产| 亚洲欧美精品专区久久| 国产乱人偷精品视频| 天堂√8在线中文| 中国美白少妇内射xxxbb| 一二三四中文在线观看免费高清| 欧美日韩一区二区视频在线观看视频在线 | 在线观看av片永久免费下载| 婷婷色av中文字幕| 国产精品一及| 18+在线观看网站| 欧美激情在线99| 久久精品91蜜桃| 在线免费观看不下载黄p国产| 精华霜和精华液先用哪个| 级片在线观看| 亚洲精品国产成人久久av| 黄色配什么色好看| 精品欧美国产一区二区三| 波多野结衣高清无吗| 成人亚洲精品av一区二区| 婷婷六月久久综合丁香| 亚洲美女搞黄在线观看| 欧美一区二区精品小视频在线| 国产 一区精品| 麻豆成人午夜福利视频| 人体艺术视频欧美日本| 日日摸夜夜添夜夜爱| 中文资源天堂在线| 国国产精品蜜臀av免费| 精品国内亚洲2022精品成人| 中文精品一卡2卡3卡4更新| av在线老鸭窝| 国产精品国产三级国产av玫瑰| 天堂影院成人在线观看| 99热网站在线观看| 国产av一区在线观看免费| 精品久久久久久电影网 | 男的添女的下面高潮视频| 简卡轻食公司| 欧美一区二区精品小视频在线| 人妻少妇偷人精品九色| 22中文网久久字幕| 久久精品夜色国产| 亚洲精品亚洲一区二区| 午夜激情欧美在线| 日产精品乱码卡一卡2卡三| 青春草国产在线视频| 亚洲自拍偷在线| 如何舔出高潮| 国产一区亚洲一区在线观看| 久久久久久久久久成人| 国产精华一区二区三区| av在线观看视频网站免费| 国产乱人偷精品视频| 久久久精品94久久精品| 看十八女毛片水多多多| 狂野欧美白嫩少妇大欣赏| 免费播放大片免费观看视频在线观看 | 三级经典国产精品| 精品欧美国产一区二区三| 在线观看av片永久免费下载| 久久精品国产亚洲网站| 黄片无遮挡物在线观看| 国产人妻一区二区三区在| 亚洲天堂国产精品一区在线| 亚洲在久久综合| 欧美成人一区二区免费高清观看| 国产免费福利视频在线观看| 禁无遮挡网站| 国产极品精品免费视频能看的| 好男人在线观看高清免费视频| 午夜福利网站1000一区二区三区| 国产黄色视频一区二区在线观看 | 亚洲国产最新在线播放| 国产免费一级a男人的天堂| 一边摸一边抽搐一进一小说| 国内精品美女久久久久久| 国产精品熟女久久久久浪| 亚洲国产高清在线一区二区三| 美女cb高潮喷水在线观看| 欧美区成人在线视频| 免费观看的影片在线观看| 久久久久久九九精品二区国产| 成人特级av手机在线观看| 赤兔流量卡办理| 亚洲av成人av| a级一级毛片免费在线观看| 九色成人免费人妻av| 欧美高清成人免费视频www| 我要搜黄色片| 黄色配什么色好看| 卡戴珊不雅视频在线播放| av天堂中文字幕网| 日本一二三区视频观看| 麻豆久久精品国产亚洲av| 国产精品美女特级片免费视频播放器| 神马国产精品三级电影在线观看| 又爽又黄无遮挡网站| 26uuu在线亚洲综合色| 别揉我奶头 嗯啊视频| 国产精品国产三级国产av玫瑰| 夜夜爽夜夜爽视频| 国产亚洲最大av| 国产探花极品一区二区| 91久久精品国产一区二区成人| av天堂中文字幕网| 国产精品熟女久久久久浪| 日韩av不卡免费在线播放| 婷婷色av中文字幕| 亚洲美女视频黄频| 观看免费一级毛片| 久久久久久国产a免费观看| 91狼人影院| 99久久无色码亚洲精品果冻| 亚洲中文字幕日韩| 午夜爱爱视频在线播放| 2021天堂中文幕一二区在线观| 精品久久久久久成人av| 亚洲av免费在线观看| 成人午夜精彩视频在线观看| 午夜亚洲福利在线播放| h日本视频在线播放| 国产精品熟女久久久久浪| 又粗又爽又猛毛片免费看| 色视频www国产| 搡女人真爽免费视频火全软件| 国产又黄又爽又无遮挡在线| 亚洲av成人精品一二三区| 乱码一卡2卡4卡精品| 精品午夜福利在线看| 免费av观看视频| 五月伊人婷婷丁香| 中文字幕人妻熟人妻熟丝袜美| 成年女人永久免费观看视频| 99久久九九国产精品国产免费| 中文乱码字字幕精品一区二区三区 | 国产又黄又爽又无遮挡在线| 哪个播放器可以免费观看大片| 午夜久久久久精精品| 成人特级av手机在线观看| 国产精品.久久久| 欧美色视频一区免费| 亚洲自拍偷在线| 又爽又黄a免费视频| 精品久久久久久久久av| 伦精品一区二区三区| 日韩高清综合在线| 亚洲真实伦在线观看| 国产大屁股一区二区在线视频| 26uuu在线亚洲综合色| 国产一区有黄有色的免费视频 | 长腿黑丝高跟| 精品少妇黑人巨大在线播放 | 波多野结衣高清无吗| 精品99又大又爽又粗少妇毛片|