欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

Retrofit源碼分析

2018-9-3    seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

1、簡介

retrofit是一個封裝okhttp請求的網絡請求庫,可以通過Rxjava適配返回信息。

2、原理分析

我們通過Retrofit.Builder建造者模式創建一個Retrofit實例對象

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方法創建一個Retrofit實例對象,在創建Retrofit時會判斷用戶創建OkhttpClient對象,沒有創建Retrofit會創建一個默認okhttpClient對象,然后設置Platform中的主線程線程池,設置線程池處理器交給主線程Looper對象。然后創建一個Retrofit對象。我們通過Retrofit.create創建一個接口代理類

 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

在調用Creater方法時,通過代理類創建Service實例對象,當我們通過接口實例對象調用方法時,通過invoke方法時,通過Method創建一個ServiceMethod對象,然后把ServiceMethod存儲起來

 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

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

 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

通過注解類型獲取到請求類型時,通過調用相關方法解析獲取到請求url,然后通過注解獲取方法中是否有注解字段,有注解信息存儲到Set集合中。然后創建一個OkhttpCall對象,通過調用serviceMethod.adapt方法做網絡請求,serviceMethod.adapt調用是callAdapter中的adapt方法,如果用戶沒有設置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中調用組裝的Call方法中enqueue方法調用異步網絡請求,成功后通過Platform中MainThreadExecutor切換到主線程。在調用callback中的enqueue,onResponse和onFairlure方法時實際是調用到OkhttpCall方法的onResponse方法,在OkHttpCall.enqueue中重新組建OkHttp.Call url和參數信息,然后封裝請求,請求成功后通過parseResponse解析返回信息狀態,然后把返回信息狀態成ResponseBody對象,調用ServiceMethod.toResponse解析,在toResponse中實際是我們設置ConverterFactory對象解析數據,完成后調用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();
            }
          }
        });
      }
藍藍設計www.ocunn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://www.ocunn.cn

存檔

成人国产精品av| 免费在线观看黄色网| 伊人网中文字幕| 免费在线视频观看| 亚洲ⅴ国产v天堂a无码二区| 无码av免费精品一区二区三区| 黄色一级二级三级| 中国丰满人妻videoshd| 国产人妻人伦精品| 一区二区视频国产| 五月天亚洲综合小说网| 欧美一区二区综合| 久久精彩视频| 九色91在线视频| 极品尤物一区二区三区| av免费观看久久| 国产福利久久精品| 波多野结衣一区二区三区在线观看| 国产精品久久久久久久久免费| 26uuu亚洲伊人春色| 欧美激情在线一区| 久久久久一本一区二区青青蜜月| 久久国产视频网站| 欧美www在线| 欧美精品精品精品精品免费| 午夜精品福利视频| 91国内产香蕉| 国产成人在线亚洲欧美| 国产精品小说在线| 成人黄色片在线| 亚洲va欧美va在线观看| 7777精品伊久久久大香线蕉语言| 91美女高潮出水| www日韩av| 久久国产精品久久精品国产| 日韩精品一区二区三区外面| 一区二区91美女张开腿让人桶| 亚洲精品一区二区三区av| 亚洲制服中文| 日韩中文字幕亚洲精品欧美| 成年人午夜视频在线观看| 日日摸日日碰夜夜爽av| 欧美一级裸体视频| av在线网站免费观看| 无码人妻久久一区二区三区蜜桃| 欧美熟妇精品一区二区蜜桃视频| 精品少妇一区二区三区免费观| 国产伦理片在线观看| 国产精品国产精品88| 91成人免费视频| 91沈先生播放一区二区| 欧美高清视频一区二区三区在线观看 | 中文字幕一区二区久久人妻| 国产精品视频一二区| 亚州av在线播放| av小片在线| 波多野在线观看| 韩国精品视频在线观看| 福利片一区二区| 99精品小视频| 视频一区二区三区入口| 成人ar影院免费观看视频| 久久精品在线免费观看| 亚洲一区二区三区中文字幕在线 | 成人激情诱惑| 99精品国产在热久久| 国产在线精品一区二区三区不卡| 久久日一线二线三线suv| 亚洲一区二区在线视频| 欧美日韩夫妻久久| 一区二区三区黄色| 青青久草在线| 日韩在线观看视频网站| 成人在线观看黄色| 欧美特大特白屁股xxxx| 色综合久久中文| 亚洲日韩成人| av一本久道久久综合久久鬼色| 亚洲欧美偷拍三级| 欧美色区777第一页| 亚洲男人的天堂在线| 91av在线免费观看| 开心色怡人综合网站| 日本精品久久久久久久久久| 免费看91视频| 久久久国产精品黄毛片| www.麻豆av| 秋霞午夜在线观看| 亚洲精品第一| 欧美日韩三级电影在线| 成人午夜视频福利| 偷偷要91色婷婷| 亚洲欧洲xxxx| 国产欧美日韩中文| 麻豆视频传媒入口| 亚洲熟女一区二区| 秋霞av一区二区三区| 欧美大片aaa| 亚洲精品粉嫩美女一区| 欧美激情国产在线| 国产精品18久久久| 欧美日韩裸体免费视频| 国产亚洲精品日韩| 91欧美激情另类亚洲| 97久久国产亚洲精品超碰热 | 国产精品伦一区二区| 欧美大人香蕉在线| 国产成人综合亚洲91猫咪| 亚洲成av人片在www色猫咪| 亚洲精品丝袜日韩| 亚洲va久久久噜噜噜久久天堂| 日韩网站在线免费观看| 国精产品视频一二二区| 亚洲精品国产手机| 卡通欧美亚洲| 牛牛国产精品| 国产欧美日韩综合精品一区二区 | 亚洲国产果冻传媒av在线观看| 色婷婷久久综合中文久久蜜桃av| 中文字幕一区二区三区手机版| 亚洲日本中文字幕在线| 国模冰冰炮一区二区| 一区二区影视| 国产天堂亚洲国产碰碰| 亚洲精品suv精品一区二区| 国产精品视频大全| 国产精品宾馆在线精品酒店| 日韩黄色免费观看| 亚洲52av| 久久激情av| 国内成+人亚洲+欧美+综合在线| 欧美性色视频在线| 欧美激情xxxx性bbbb| 一区二区日本伦理| 色欲狠狠躁天天躁无码中文字幕| 日本加勒比一区| 麻豆久久久久| 麻豆精品视频在线观看视频| 一本大道综合伊人精品热热| 久久免费视频网| 波多野结衣与黑人| 爱爱视频免费在线观看| 国产尤物视频在线| 国产99精品| 久久精品亚洲精品国产欧美| 亚洲精品视频久久| 免费久久99精品国产自| av黄色免费网站| 成r视频免费观看在线播放| 一本一道久久a久久| 国产不卡一区视频| 精品国内片67194| 国产一区视频观看| 国产传媒第一页| 色播在线观看| 亚洲黄页在线观看| 久久综合精品国产一区二区三区| 日韩精品中文字幕视频在线| 蜜桃精品久久久久久久免费影院| 亚洲区自拍偷拍| 国产一区二区三区福利| 精品国产中文字幕第一页| 中文字幕欧美国产| 欧美成人精品一区二区三区| 国产精品一线二线三线| 亚洲欧美偷拍视频| 亚洲人体影院| 激情综合五月婷婷| 亚洲国产精品福利| 亚洲 日韩 国产第一区| 国产精品久久久久久久精| 看女生喷水的网站在线观看| 精品69视频一区二区三区Q| 欧美日韩一区二区在线| 国产精品专区第二| 国产xxx在线观看| 尤物视频免费在线观看| 成人羞羞视频在线看网址| 亚洲免费观看高清在线观看| 欧美亚洲第一页| 天天摸天天舔天天操| 神马午夜精品95| 欧美猛男同性videos| 一区二区三区精品视频在线| 日韩免费av在线| 黄页网站在线看| 未来日记在线观看| 欧美 日韩 国产一区二区在线视频| 欧美日韩国产精品一区| 亚洲va欧美va在线观看| 妖精视频在线观看免费| 国内老司机av在线| 精品亚洲porn| 色哟哟亚洲精品一区二区| 少妇无码av无码专区在线观看| 91中文字幕在线播放| 国产精品流白浆在线观看| 中文字幕亚洲不卡| 国产99久久精品一区二区| 男女性杂交内射妇女bbwxz| 国产精品天堂| 日韩在线a电影| 国产丝袜一区视频在线观看 | 色呦呦在线视频| 韩国视频一区二区| 伊人伊成久久人综合网小说| 欧在线一二三四区| 亚洲 国产 欧美 日韩| 欧美在线高清| 欧美一区二区三区免费大片| 日本黄色播放器| 国产裸体永久免费无遮挡| 国产成人影院| 欧美视频一区二区三区四区 | 欧美一卡二卡在线观看| 日本一区二区免费高清视频| 国产视频在线观看视频| 久久要要av| 日韩欧美国产成人一区二区| 800av在线免费观看| 刘亦菲毛片一区二区三区| 亚洲有吗中文字幕| 日韩欧美电影在线| 国产日韩av网站| 中文字幕校园春色| 亚洲日本久久| 一本大道亚洲视频| 婷婷激情小说网| 久久精品视频免费看| 国产精品综合av一区二区国产馆| 欧美大荫蒂xxx| 91丨porny丨对白| mm视频在线视频| 久久精品一区二区三区av| 国产精品久久久久久久久久99| 日本免费www| 久久av影院| 香蕉乱码成人久久天堂爱免费| 欧美国产二区| 精品人妻无码一区二区三区蜜桃一| 一区二区三区在线电影| 精品无人区乱码1区2区3区在线| 美女喷白浆视频| 欧美精品电影| av成人老司机| 亚洲va电影大全| 中文字幕免费视频观看| 亚洲一本二本| 日韩在线免费高清视频| 亚洲日本久久久| 校园春色亚洲| 亚洲国产裸拍裸体视频在线观看乱了 | 久久一级电影| 日韩成人在线视频| 91亚洲一区二区| 欧美少妇精品| 一区二区三区中文字幕在线观看| 日本在线成人一区二区| 日本精品久久久久| 麻豆国产精品视频| 欧美一级免费视频| 国产成人在线免费观看视频| 日韩欧美不卡| 亚洲欧美日韩直播| 极品白嫩丰满美女无套| 亚洲ww精品| 在线播放91灌醉迷j高跟美女 | 免费国产黄色片| 免费看欧美美女黄的网站| 91精品国产亚洲| 国产精品成人网站| 日韩精品一区二区久久| 一本一道久久a久久精品逆3p | 免费看成人哺乳视频网站| 亚洲国产精品女人久久久| av av在线| 精品国产三级| 欧美一区二区三区视频在线观看 | 日本在线成人| 日韩欧美在线综合网| 国产成人av免费观看| 亚洲欧美一级| 日韩精品一区二区三区四区| 国产伦理在线观看| 亚洲2区在线| 亚洲精品不卡在线| 久久久久久久久久久国产精品| 老牛精品亚洲成av人片| 日韩av中文字幕在线免费观看| 波多野结衣视频播放| 亚洲国产精品免费视频| 欧美精品一区二区三区很污很色的| www.黄色网| 澳门精品久久国产| 亚洲精品一区二区三区婷婷月| 亚洲精品午夜视频| 精品日产免费二区日产免费二区| 中文字幕日韩av| 欧美成人精品激情在线视频| 欧美精品一线| 国产成人久久久| 国产ts变态重口人妖hd| 懂色av中文一区二区三区| 精品国产一区二区三区麻豆小说 | 亚洲妇熟xxxx妇色黄| 午夜伦理一区二区| 免费看污污网站| 首播影院在线观看免费观看电视| 成人爱爱电影网址| 亚洲精品久久久久久一区二区| 亚洲成a人v欧美综合天堂麻豆| 亚洲国产精品一区二区www在线 | 日韩一区视频在线| 久久精品女人毛片国产| 午夜在线播放视频欧美| 国产日韩欧美在线| 992tv在线影院| 亚洲国产电影在线观看| 欧妇女乱妇女乱视频| 在线精品亚洲欧美日韩国产| 日韩一级精品视频在线观看| 国产激情在线免费观看| 久久在线免费| 日韩免费观看网站| 亚洲精品久久久狠狠狠爱| 久久久精品日韩欧美| 日本一区午夜艳熟免费| 欧美成人ⅴideosxxxxx| 亚洲精品一区二区三区香蕉| 日韩黄色免费观看| 三级影片在线观看欧美日韩一区二区| 91精品入口蜜桃| www.在线播放| 在线精品视频免费播放| 亚洲第一香蕉网| 韩日视频一区| 亚洲自拍偷拍第一页| 高清国产福利在线观看| 欧美性开放视频| 级毛片内射视频| 国内自拍视频一区二区三区| 91中文字幕在线观看| a√资源在线| 欧美日韩国产中文| 国产又粗又长又黄的视频| 免费看的黄色欧美网站| 久久综合久久久| 黄色美女视频在线观看| 亚洲精品在线电影| 三级黄色在线视频| 国产精品一区免费视频| 热久久最新地址| 国产精品亚洲一区二区在线观看 | 日韩电影中文字幕在线| 久久久久久少妇| 99精品欧美一区二区三区小说| 亚洲精品蜜桃久久久久久| 亚洲国产欧美在线观看| 高清视频欧美一级| 福利h视频在线| 色先锋资源久久综合| 91成人精品一区二区| 日本在线播放一区二区三区| 正在播放一区| а天堂中文最新一区二区三区| 久久亚洲精品小早川怜子66| 亚洲av无码国产综合专区 | 国产精品一区二区三区美女| 韩剧1988在线观看免费完整版 | 国产亚洲成av人在线观看导航 | 视频黄页在线| 欧美在线不卡一区| 天天干中文字幕| 成人毛片老司机大片| www.色就是色| 亚洲精品网址| 蜜桃传媒视频第一区入口在线看| 日韩欧美一区二区三区在线观看| 久久网福利资源网站| 黄污在线观看| 欧美日韩久久一区二区| 亚洲精品www久久久久久| 91免费观看视频| 九九九久久久久久久| 亚洲国产高清一区| 亚洲欧洲免费无码| 亚洲2区在线| 国产精品揄拍500视频| 婷婷av在线| 日韩有码视频在线| 免费高清在线| 日韩欧美一级二级| 一区二区www| 午夜久久福利影院| 久久国产免费观看| 久久久久久久久久久久久久久99 | 欧美又粗又长又爽做受| 精品中文一区| 蜜桃视频成人| 99久久香蕉|