午夜勾魂曲-午夜福利自怕-午夜福利在线观看6080-午夜福利院电影-国产精品毛片AV久久97-国产精品麻豆高潮刺激A片

Retrofit源碼分析

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

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

1、簡(jiǎn)介

retrofit是一個(gè)封裝okhttp請(qǐng)求的網(wǎng)絡(luò)請(qǐng)求庫(kù),可以通過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ǔ)起來(lái)

 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方法,我們?cè)谕ㄟ^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í)際是我們?cè)O(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.gerard.com.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(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è)人資料

存檔

主站蜘蛛池模板: 国产亚洲欧美日韩亚洲中文色 | 尤物九九久久国产精品的特点 | 美女啪啪av | 国产色无码精品视频免费 | 欧洲grand老妇人 | 全球av集中精品导航福利 | 奇米影视777第四色 奇米影视777四色 | 乱中年女人伦av三区 | 老妇肥熟凸凹丰满刺激小说 | 色妞ww精品视频7777nga | 香蕉视频在线免费看 | 成人51免费| 免费看的一级视频 | 久久久久无码精品亚洲日韩 | 在线观看精品视频网站 | 欧美jizzhd精品欧美 | 成人乱码一区二区三区av66 | 中字幕人妻一区二区三区 | 天天躁夜夜躁天干天干2022 | 亚洲va视频 | 欧美激情精品久久久久久免费 | 91中文字幕视频 | 懂色aⅴ精品一区二区三区蜜月 | 国产主播毛片 | 亚洲精品一区二区三区在线观看 | 亚洲国产精品无码久久青草 | 看曰本女人大战黑人视频 | 色综合久久久久无码专区 | 淫片一级国产 | 一二三四免费观看在线视频中文版 | 亚洲女同志亚洲女同女播放 | 人人妻人人澡人人爽人人精品av | 精品视频一二区 | 红杏亚洲影院一区二区三区 | 免费成人结看片 | 波多野结衣有码 | 波多野结衣办公室33分钟 | 中文亚洲欧美日韩无线码 | 成人黄色免费在线观看 | 范冰冰一级做a爰片久久毛片 | 欧美a影院 | 超碰av在线免费观看 | 久久久精品免费 | 4438xx亚洲五月最大丁香 | 久久国产一区二区 | 欧美色欧美亚洲高清在线观看 | 少妇高潮太爽了在线观看 | 日韩中文字幕网站 | 国产精品一区二区毛片 | 亚洲成av人影院 | 国内少妇毛片视频 | 亚洲综合在线视频 | 热久久国产 | 国产精品久久久一区二区三区网站 | 国产精自产拍久久久久久蜜 | 久久久久久久久无码精品亚洲日韩 | 久久综合九色综合欧美狠狠 | 91亚洲精品国偷拍自产 | 日本性xxxxx 日本性高潮视频 | 精品亚洲成人 | 亚洲精品国产摄像头 | 亚洲处破女av一区二区中文 | 亚洲欧美日韩久久精品 | x88av乱视频| 亚洲色五月 | 香蕉成人臿臿在线观看 | 人人做人人爽 | 激情图片在线视频 | 成人免费黄色 | 免费无遮挡无码永久视频 | 成熟丰满熟妇高潮xxxxx视频 | 激情欧美在线 | 夜夜高潮夜夜爽精品视频 | 欧美激情一区二区三区p站 欧美激情一区二区三区蜜桃视频 | 精品久久久久久久久久久久包黑料 | 李宗瑞91在线正在播放 | 天天射天天草 | 久久久久国产精品久久久久 | 国产淫语对白 | 中文字幕在线播出 | 韩国一区二区三区美女美女秀 | 无码精品人妻一区二区三区湄公河 | 国产综合久久久久 | 搡国产老太xxx网站 搡老女人一区二区三区视频tv | 亚洲日韩中文字幕在线播放 | 久操色| 亚洲精品精华液一区 | 在线操 | 一级特黄bbb大片免费看 | 亚洲国产影院av久久久久 | 久久久久久久久99精品 | 中文国产成人精品久久不卡 | 欧美性猛交乱大交xxxx | 最新在线黄色网址 | 欧美一区二区三区四 | 日韩精品在线免费观看 | 免费av资源在线观看 | 天天干天天射天天操 | 婷婷五月综合丁香在线 | 国产一区在线视频观看 | 亚洲jlzzjizz少妇 | 在线免费观看视频a | √天堂中文www官网在线 | 老妇女性较大毛片 | 日本熟妇毛茸茸丰满 | jzzijzzij日本成熟丰满 | 九九热免费 | 女人精69xxxⅹxx入口 | 亚洲aⅴ在线 | 国产精品永久久久久 | 日韩视频中文字幕在线观看 | 亚洲国产欧美日韩在线观看第一页 | 国内毛片毛片毛片毛片 | 精品人妻久久久久久888 | 欧美一区二区福利视频 | 亚洲精品www久久久 国产免费无码一区二区视频 | 依依成人精品视频在线观看 | 农村末发育av片一区二区 | 悠悠色在线 | 性插插视频 | 你懂的网址在线观看 | 爱爱的免费视频 | 大桥未久在线视频 | 亚洲福利视频一区 | 亚洲黄色大全 | av播播 | 国产精品久久久久久婷婷 | 国产精品一品二区三区的使用体验 | 狠狠草视频 | 亚洲一区中文 | 99久久人人爽亚洲精品美女 | 农村乱视频一区二区三区 | 麻豆精品国产精华精华液好用吗 | 日噜噜夜噜噜 | 色噜噜日韩精品欧美一区二区 | 中国女人内谢69xxxxⅹ视频 | 一级片大片 | 久久国产精品无码一区二区三区 | 无码人妻精品一二三区免费 | 欧美日韩国产精品一区 | a级港片免费完整在线观看 a级高清毛片 | 亚洲精品一区二区三区中文字幕 | 人妻无码不卡中文字幕系列 | 成人毛片在线视频 | 女性脱给我揉视频 | 国产伦精品一区二区三区视频我 | 国产嘿咻视频 | 国产乡下妇女做爰毛片 | 国色天香久久久久久久小说 | 夜夜爽久久揉揉一区 | 窝窝影院午夜看片 | 么公的好大好硬好深好爽视频 | www深夜福利 | 久热这里只有精品视频6 | 少妇无套内谢久久久久 | 亚洲精品国产自在久久 | 亚洲国产成人久久 | 国产在线精品一区二区高清不卡 | 亚洲精品久久久久久久蜜桃 | 又色又爽又黄高潮的免费视频 | 欧美va视频 | 精品国产乱码久久久久久免费 | 91在线看视频免费 | 久久不见久久见免费影院www日本 | 日本丰满熟妇bbxbbxhd | 闺蜜互慰吃奶互揉69式磨豆腐 | 色偷偷亚洲男人本色 | 日韩精品视频一二三 | 免费一区二区无码东京热 | 国产人妻久久精品二区三区老狼 | 在线观看亚洲天堂 | 久久久妇女国产精品影视 | 国产91av在线播放 | 免费无码不卡视频在线观看 | 午夜看毛片 | 国产精品视频久久久久久久 | 91麻豆精品国产91久久久久久久久 | 日本久久久久久久做爰片日本 | 精品国产一区二区三区四区在线 | 久久亚洲一区二区三区成人国产 | 国产精品无码av天天爽播放器 | 免费看成人av| 久久亚洲精品成人av无码网站 | 少妇精品导航 | 亚洲成人黄色小说 | 亚洲精品精华液一区 | 一边捏奶头一边高潮视频 | 蜜臀久久精品 | 我要操av | 在线观看亚洲天堂 | 亚洲精品天堂久久久老牛 | 日韩在线观看视频一区二区三区 | 99热网址| av免费观看网址 | 人人妻人人澡人人爽人人dvd | 天天看天天操 | 久久久久女人精品毛片 | 中文无码日韩欧 | 11月流出美女撒尿偷拍在线播放 | 国产欧美激情在线观看 | 日本韩无专砖码高清 | 欧美亚洲一 | 狠狠v欧美ⅴ日韩v亚洲v大胸 | 不卡的av在线免费观看 | 9色在线视频 | 无码人妻久久一区二区三区蜜桃 | 99ri在线观看 | 国产 字幕 制服 中文 在线 | 国产91在线播放九色000 | 91精品在线免费 | 久久成年片色大黄全免费网站 | 五月天婷婷激情网 | 蜜桃精品视频在线 | 免费毛儿一区二区十八岁 | 护士脱了内裤让我爽了一夜视频 | 久久免费精品 | 天天摸天天操天天射 | 日本a级黄绝片a一级啪啪 | 日本内射精品一区二区视频 | 性调教学院高h学校 | 亚洲中文字幕久在线 | 国精产品乱码一区一区三区四区 | 人成网站在线观看 | 国产超碰人人做人人爽av牛牛 | 国产成人三级在线观看视频 | 专干老熟女视频在线观看 | 日韩av女优在线观看 | 日韩视频在线一区二区 | 撸撸在线视频 | 国产精品久久久久久精 | 国产黄色在线看 | 日韩精品视频免费看 | 好吊色这里只有精品 | 男女av在线 | a v视频在线观看 | 最近中文2019字幕第二页 | 天天干天天添 | 国产伦精品一区二区三区照片 | 人人添人人澡人人澡人人人人 | 亚洲黄色a级片 | 一边吃奶一边摸下边激情说说 | 丁香五月欧美成人 | 狠狠综合网 | 亚洲毛片网| 肥熟一91porny丨九色丨 | 久久久久久亚洲精品不卡4k岛国 | 国产天堂av在线 | 日本69精品久久久久999小说 | 欧美黄网址 | 思九九爱九九 | 国产中文字二暮区 | 5d肉蒲团之性战奶水 | 日韩精品无码免费一区二区三区 | 亚洲男人的天堂av手机在线观看 | 好吊视频一区二区 | 香蕉视频久久久 | 日本黄色生活片 | 男女交性全过程免费观看网站 | 内射欧美老妇wbb | 日日躁夜夜躁人人揉av五月天 | 国产毛片久久久久久国产毛片 | 九九在线观看高清免费 | 欧美激情天堂 | 嫩草影院一区二区 | 少妇大叫太大太粗太爽了a片小说 | 国产全肉乱妇杂乱 | 年代肉高h喷汁呻吟快穿 | 抽插丰满内射高潮视频 | 麻豆av片 | 日韩欧美色图 | 99久热在线精品996热是什么 | 爽插| 亚洲精品国产精 | 日韩不卡中文字幕 | 日韩视频中文字幕在线观看 | 免费 成 人 黄 色 | 欧美成人一区二免费视频软件 | 免费在线看黄色片 | 伊人情人综合网 | av拍拍拍| 黄色片在哪看 | 国产成人精品综合在线观看 | 国产精品久久久久久久久久久久午 | 黄页网站视频免费大全 | 国产精品无码永久免费不卡 | 两男一前一后cao一女 | 99久久精品国产片果冻的功能特点 | 国产成人精品视频一区二区不卡 | 把腿张开老子臊烂你多p视频 | 99极品视频 | 天天操天天谢 | 成人在线亚洲 | 欧美色成人 | 唯美欧美亚洲 | 91视频免费网址 | 美女隐私黄www网站免费 | 日本黄色动态图 | yy8男人的天堂 | 日韩精品中文字幕一区二区 | 草女人视频| 日本不卡1| 毛片在线免费视频 | 天天综合视频 | 国产精品久久久久久久龚玥菲 | 福利视频大全 | 91美女吸乳羞羞网站 | 欧美视频在线观看免费 | 女人爽到高潮免费视频大全 | 春草| 天天射天天干天天 | 91快色| 成人片黄网站色大片免费观看 | 色一情一狱一爱一乱 | 国内精品一区二区 | av片在线观看 | 精品国产乱码一区二区 | 激情天堂网| 中文字幕在线免费看线人 | 久久精品日日躁夜夜躁 | 色综合99久久久无码国产精品 | 久草视频精品 | 怡红院综合网 | 成年人的天堂 | 亚洲三级影视 | 蜜桃av噜噜 | 中文字幕日日夜夜 | 久久精品国产麻豆 | 午夜天堂av | 一级做a爱片性色毛片 | 大胸美女拍拍18在线观看 | 精品福利视频一区二区 | 国产成人精品亚洲午夜麻豆 | 99精品久久久久久 | 特级毛片在线观看 | 欧美性猛片xxxxx免费中国 | 东北话对白xxxx | 亚洲成人av在线 | 国产18禁黄网站免费观看 | 欧美啪视频 | 精品久久网站 | 成年人视频网站 | 国产精品毛片一区二区在线看舒淇 | av在线免 | 我要看免费毛片 | 神马久久网站 | 日本少妇高潮叫床声一区二 | 久久网页 | 国产成人亚洲综合无码精品 | 国产伦精品一区二区三区视频不卡 | 国产超碰久久av青草 | 亚洲综合色婷婷在线观看 | 狠狠色丁香婷婷综合 | 免费av资源 | 亚洲精品综合五月久久小说 | 久久久婷 | 欧美另类z0z变态 | 日本一道高清一区二区三区 | 深夜福利免费在线观看 | 国产福利视频在线 | 国产三a级三级日产三级野外 | 婷婷色影院 | 中文字幕视频观看 | 午夜精品久久久久久久99老熟妇 | 日本少妇aa特黄毛片亚洲 | 日本500人裸体仓房视频 | 激情视频一区 | 亚洲狠狠爱一区二区三区 | 精品国产一区二区三区无码 | 依人在线 | 自拍新婚之夜初交视频1 | 性欧美极品另类 | 国产系列精品av | 玩弄japan白嫩少妇hd | 中国免费黄色 | 女女综合网 | 国产精品亚洲аv无码播放 露脸内射熟女--69xx | 色综亚洲国产vv在线观看 | 八区精品色欲人妻综合网 | youjizz少妇| 午夜精品久久久久久久99老熟妇 | 国产普通话对白刺激 | 999色综合 | 超碰av人人| 久久久噜噜噜 | 亚洲综合影视 | 中文字幕乱码中文乱码51精品 | 日韩欧美毛片 | 91亚色视频在线观看 | 欧美精品亚洲精品 | 欧美在线视频一区二区 | 人人澡人人透人人爽 | 国产13页 | 国产乱码一区二区三区 | √天堂 | 黑人性视频 | 欧美最猛黑人xxxx黑人猛交98 | 国产又黄又硬又湿又黄的播出时间 | 亚洲乱码日产精品一二三 | 国产欧美日 | 国产97色 | 激情国产av做激情国产爱 | 中文字幕人成人乱码亚洲电影 | 成人免费高清视频 | 欧美视频网站www色 精品无码久久久久久久动漫 | 波多野结衣一区二区三区免费视频 | 国产精品久久久久久久 | 曰本不卡视频 | 91麻豆精产国品一二区灌醉 | 国产成人免费片在线观看 | 高清国产亚洲精品自在久久 | 国产精品亚洲аv无码播放 露脸内射熟女--69xx | 美女又爽又黄又免费 | 国产精品免费久久久久影院仙踪林 | 国产精品黄在线观看免费软件 | 伊人久久久久久久久久久久 | 精品一区二区三区av | 欧美男生射精高潮视频网站 | 亚洲精品一区二区三区蜜桃 | 精品无码无人网站免费视频 | 日本少妇激三级做爰在线 | 国产精品老女人 | 午夜又黄又爽 | 性色av一区二区咪爱 | 岛国av资源| 亚洲欧洲成人 | 最新成人av | 国产91高潮流白浆在线麻豆 | 中文字幕首页 | 米奇777四色精品人人爽 | 精品在线观看视频 | 在线播放国产一区二区三区 | 精品视频免费在线观看 | 欧美人与动欧交视频 | 紧缚捆绑精品一区二区 | 久久久www影院人成_免费 | 中文字幕丰满孑伦无码专区 | 免费人成在线观看网站品爱网 | 在线天堂新版最新版在线8 麻豆成人精品国产免费 | 亚洲欧美色中文字幕在线 | 亚洲视频在线观看 | 国产精品久久久一区麻豆最新章节 | 秋霞视频在线观看 | 男人激烈吮乳吃奶视频片 | 国产精品 欧美激情 | 色妞干网| 麻豆视频软件 | 国产精品免费福利久久 | 日本黄色的视频 | 正在播放大战肉丝少妇 | 国产新婚露脸88av | 天天狠狠操 | 日本japanese丰满少妇 | 午夜亚洲福利在线老司机 | 久久草草亚洲蜜桃臀 | 婷婷久久五月 | 久久久久一区 | 成人av网站在线观看 | 成人免费在线播放视频 | jzzjzz日本丰满成熟少妇 | 欧美激情精品久久久久久 | 久久99热这里只频精品6 | 国产精品乱子伦免费视频 | 无码人妻精品一区二区三区东京热 | 亚洲国产aⅴ精品一区二区 亚洲国产mv | 麻豆av一区二区 | 97久久精品一区二区三区观看 | 另类欧美日韩 | 久久av无码精品人妻系列试探 | 亚洲综合久 | 新版本天堂资源在线中文8的特点 | 少妇av一区二区三区无码 | 亚洲字幕av一区二区三区四区 | 日韩黄色影片 | 久久精品欧美日韩精品 | 91av视频 | 欧美亚洲国产一区二区三区 | 国产黄色av网站 | 成人免费视频一区二区三区 | 亚洲色成人网一二三区 | 日韩中文字幕免费观看 | fc2ppv在线观看 | 亚洲一区二区三区四区 | 黄色av在 | 天天射夜夜骑 | 日韩精品在线视频 | 免费观看性生活大片3 | 国产成人精品一区二区三区在线 | 午夜精品在线免费观看 | 成人午夜视频在线观看 | 清清草在线视频 | 玖玖在线| 紧缚捆绑精品一区二区 | 国产美女视频一区二区三区 | 欧美成人精品三级在线观看播放 | 国产a级黄色毛片 | 国产精品成人片在线观看 | 国产欧美一区二区精品婷婷 | 黄色一级视频网 | 波多野结衣一级 | 亚洲高清影院 | 精品久久久中文字幕人妻 | 性猛交娇小69hd | 欧美另类z0z变态 | 国产精品国产三级国产普通话三级 | 国产制服丝袜一区 | 国产免费一级特黄录像 | 绯色av中文字幕一区三区 | 欧美精品久久久久 | 女同精品一区二区三区在线播放器 | 久草免费资源站 | av夜夜| 精品久久久久久久无码 | 日本成片网 | 最新国产拍偷乱偷精品 | 色无极亚洲影院 | 天堂中文网 | 在线欧美激情 | 欧美日韩精品一区二区三区 | 91一区在线 | 无码少妇a片一区二区三区 免费无码av片在线观看网站 | www.在线观看av | 色噜噜狠狠色综合中国 | 国产网红av | 色哟哟一区二区三区精华液 | 国产igao为爱做激情在线观看 | 国产一区精品视频 | 免费毛片播放 | 中国另类性xxxhd100% | 亚洲人成网亚洲欧洲无码久久 | 亚洲第一免费 | 91久久久久久久久 | 中文字幕av无码一区二区三区电影 | 伊人www22综合色 | 日韩一级免费 | 雨宫琴音av一区在线播放 | 亚洲va码欧洲m码 | 国产亚洲综合一区二区 | 日韩免费黄色片 | 国内精品少妇 | 日韩一级完整毛片 | 五月天婷婷综合网 | 狠狠干在线 | 婷婷网址 | 日韩人妻ol丝袜av一二区 | 14萝自慰专用网站 | blacked蜜桃精品一区 | 欧美日韩国产精品成人 | 操老女人视频 | 国产激情久久久久影院老熟女 | 国产成人亚洲综合色婷婷 | 国产明星xxxx精品hd | 日韩性xxxx | 国产乱码精品一区二区三区不卡 | 久久久久久爱 | 偷偷操av| 欧美日韩一区在线播放 | 四虎国产精品成人免费4hu | 特级a老妇做爰全过程 | 夜夜躁狠狠躁日日躁麻豆 | 欧美久久一区 | 麻豆精品久久 | 免费人成视频网站在线观看18 | 中文在线一区 | 大黄毛片 | 秋霞欧美一区二区三区视频免费 | 国产高清日韩 | 婷婷五综合 | 黄色理论片 | 成人羞羞国产免费游戏 | 他揉捏她两乳不停呻吟微博 | 亚洲一二三精品 | 日韩 欧美 亚洲 国产 | 中文字幕在线观看线人 | 国产黑丝在线视频 | 亚洲精品午夜 | 国产小视频在线播放 | 欧美自拍偷拍第一页 | 成人免费在线观看 | 天堂网在线最新版www中文网 | 波多野结衣免费视频观看 | 天天干,天天操,天天射 | 黄网在线观看视频 | 精品一二三 | 日本在线观看免费 | 欧美成人家庭影院 | 九七影院在线观看免费观看电视 | 国产深夜福利在线 | 日本aaaa级毛片在线看 | 欧亚乱熟女一区二区在线 | 97国产超碰| 性按摩玩人妻hd中文字幕 | 成人在线高清 | av大片免费观看 | 九九九热精品免费视频观看网站 | 久久久免费观看 | 人妻无码第一区二区三区 | 成人免费毛片免费 | 欧美精品久久一区二区 | 野外做受又硬又粗又大视频√ | 性猛交富婆╳xxx乱大交麻豆 | 欧美久久一区二区 | 成人男同在线观看 | 337p嫩模大胆色肉噜噜噜 | av导航在线 | 性欧美色图 | 欧美a在线播放 | 天堂网2018| 影音先锋中文在线 | 成人一级视频 | 手机在线免费av | 人妻丰满熟妇岳av无码区hd | 大尺度做爰呻吟舌吻网站 | 日本a天堂 | 亚洲欧美婷婷 | 新亚洲天堂 |