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

源碼進階之lifecycle組件原理分析

移動開發 Android
如何利用 android.arch.lifecycle 包提供的類來控制數據、監聽器等的 lifecycle。同時,LiveData 與 ViewModel 的 lifecycle 也依賴于 Lifecycle 框架;今天我們就來聊聊lifecycle的實現原理,來一波分析。

[[421728]]

前言

如何利用 android.arch.lifecycle 包提供的類來控制數據、監聽器等的 lifecycle。同時,LiveData 與 ViewModel 的 lifecycle 也依賴于 Lifecycle 框架;

今天我們就來聊聊lifecycle的實現原理,來一波分析

一、為什么要引進Lifecycle?

1、沒有引進Lifecycle做法

  • 在處理Activity或者Fragment組件的生命周期相關時,不可避免會遇到這樣的問題;
  • 在Activity的onCreate()中初始化某些成員(比如MVP架構中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中對這些成員進行對應處理,在onDestroy中釋放這些資源,這樣導致我們的代碼也許會像這樣;
  1. class MyPresenter{ 
  2.     public MyPresenter() { 
  3.     } 
  4.     void create() { 
  5.         //do something 
  6.     } 
  7.     void destroy() { 
  8.         //do something 
  9.     } 
  10. class MyActivity extends AppCompatActivity { 
  11.     private MyPresenter presenter; 
  12.     public void onCreate(...) { 
  13.         presenter= new MyPresenter (); 
  14.         presenter.create(); 
  15.     } 
  16.     public void onDestroy() { 
  17.         super.onDestroy(); 
  18.         presenter.destory(); 
  19.     } 

代碼沒有問題,關鍵問題是,實際生產環境中 ,這樣的代碼會非常復雜,你最終會有太多的類似調用并且會導致 onCreate() 和 onDestroy() 方法變的非常臃腫;

2、引進Lifecycle做法

Lifecycle 是一個類,它持有關于組件(如 Activity 或 Fragment)生命周期狀態的信息,并且允許其他對象觀察此狀態;

代碼如下:

Prestener繼承LifecycleObserver接口

  1. public interface IPresenter extends LifecycleObserver { 
  2.     @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 
  3.     void onCreate(@NotNull LifecycleOwner owner); 
  4.     @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 
  5.     void onDestroy(@NotNull LifecycleOwner owner); 
  6.     @OnLifecycleEvent(Lifecycle.Event.ON_ANY) 
  7.     void onLifecycleChanged(@NotNull LifecycleOwner owner, 
  8.                             @NotNull Lifecycle.Event event); 
  9. public class BasePresenter implements IPresenter { 
  10.     private static final String TAG = "com.qingmei2.module.base.BasePresenter";     
  11.     @Override 
  12.     public void onLifecycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event) { 
  13.     } 
  14.     @Override 
  15.     public void onCreate(@NotNull LifecycleOwner owner) { 
  16.         Log.d("tag""BasePresenter.onCreate" + this.getClass().toString()); 
  17.     } 
  18.     @Override 
  19.     public void onDestroy(@NotNull LifecycleOwner owner) { 
  20.         Log.d("tag""BasePresenter.onDestroy" + this.getClass().toString()); 
  21.     } 

直接將我想要觀察到Presenter的生命周期事件都列了出來,然后封裝到BasePresenter 中,這樣每一個BasePresenter 的子類都能感知到Activity容器對應的生命周期事件,并在子類重寫的方法中,對應相應行為

在Activity/Fragment容器中添加Observer

  1. public class MainActivity extends AppCompatActivity { 
  2.     private IPresenter mPresenter; 
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         Log.d("tag""onCreate" + this.getClass().toString()); 
  7.         setContentView(R.layout.activity_main); 
  8.         mPresenter = new MainPresenter(this); 
  9.         getLifecycle().addObserver(mPresenter);//添加LifecycleObserver 
  10.     } 
  11.     @Override 
  12.     protected void onDestroy() { 
  13.         Log.d("tag""onDestroy" + this.getClass().toString()); 
  14.         super.onDestroy(); 
  15.     } 

每當Activity發生了對應的生命周期改變,Presenter就會執行對應事件注解的方法

二、Lifecycle原理層層深入分析

在Activity 獲取 Lifecycle,實際上是通過Activity的父類 ComponentActvitiy 獲取,父類實現了 LifecycleOwner 接口,就能獲取 Lifecycle ,最后注冊 LifecycleObserver 就能拿到生命周期回調了

1、 onCreate

  1. 在ComponentActvitiy的 onCreate 方法里面可以看到 ReportFragment 的創建。 
  2.     /* ComponentActvitiy */ 
  3.     @Override 
  4.     protected void onCreate(@Nullable Bundle savedInstanceState) { 
  5.         ... 
  6.         ReportFragment.injectIfNeededIn(this); 
  7.         ... 
  8.     } 

2、 getLifecycle方法

  1. /* ComponentActvitiy */ 
  2.   private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 
  3.   @NonNull 
  4.   @Override 
  5.   public Lifecycle getLifecycle() { 
  6.       return mLifecycleRegistry; 
  7.   } 
  8.  Life 

3、 Lifecycle.Event

Lifecycle.Event 是個枚舉類,這里的生命周期 Event 并不是Fragment的,在后面的生命周期處理時會用上的。

  1. public enum Event { 
  2.      ON_CREATE, 
  3.      ON_START, 
  4.      ON_RESUME, 
  5.      ON_PAUSE, 
  6.      ON_STOP, 
  7.      ON_DESTROY, 
  8.      ON_ANY; 
  9.     ... 
  10.  } 

4、 ReportFragment的創建

ReportFragment 是一個 沒有界面的Fragment,如果有了解過Glide原理的同學,應該也知道這個方法,就是通過看不見的Fragment,來感知生命周期,讓使用者無需考慮生命周期的問題。

在SDK29以上的版本 使用的是 LifecycleCallbacks.registerIn(activity)。

  1. /* ReportFragment */ 
  2.   public static void injectIfNeededIn(Activity activity) { 
  3.       if (Build.VERSION.SDK_INT >= 29) { 
  4.           // On API 29+, we can register for the correct Lifecycle callbacks directly 
  5.           LifecycleCallbacks.registerIn(activity); 
  6.       } 
  7.       // Prior to API 29 and to maintain compatibility with older versions of 
  8.       // ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and 
  9.       // need to support activities that don't extend from FragmentActivity from support lib), 
  10.       // use a framework fragment to get the correct timing of Lifecycle events 
  11.       android.app.FragmentManager manager = activity.getFragmentManager(); 
  12.       if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { 
  13.           manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); 
  14.           // Hopefully, we are the first to make a transaction
  15.           manager.executePendingTransactions(); 
  16.       } 
  17.   } 

5、 LifecycleCallbacks.registerIn(activity)

LifecycleCallbacks 實現了 Application.ActivityLifecycleCallbacks接口,在SDK29以上的生命周期分發是由Application 分發的,activity注冊就能回調。

大名鼎鼎的LeakCanary在監聽Activity生命周期,也是使用

  1. Application.ActivityLifecycleCallbacks。 
  2.     @RequiresApi(29) 
  3.     static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks { 
  4.         static void registerIn(Activity activity) { 
  5.             activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks()); 
  6.         } 
  7.         ... 
  8.         @Override 
  9.         public void onActivityPostCreated(@NonNull Activity activity, 
  10.                 @Nullable Bundle savedInstanceState) { 
  11.             dispatch(activity, Lifecycle.Event.ON_CREATE); 
  12.         } 
  13.       ... 
  14.     } 

6、 ReportFragment.dispatch 版本兼容

如果SDK版本小于29,ReportFragment的各個生命周期方法里,會調用 dispatch 方法。

比如 onActivityCreated。

反正無論是使用 LifecycleCallbacks.registerIn(activity),還是 Fragment 的生命周期回調,最后都會dispatch。

  1. @Override 
  2.    public void onActivityCreated(Bundle savedInstanceState) { 
  3.        super.onActivityCreated(savedInstanceState); 
  4.        dispatchCreate(mProcessListener); 
  5.        dispatch(Lifecycle.Event.ON_CREATE); 
  6.    } 
  7.    private void dispatch(@NonNull Lifecycle.Event event) { 
  8.        if (Build.VERSION.SDK_INT < 29) { 
  9.            // Only dispatch events from ReportFragment on API levels prior 
  10.            // to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks 
  11.            // added in ReportFragment.injectIfNeededIn 
  12.            dispatch(getActivity(), event); 
  13.        } 
  14.    } 
  15.    static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) { 
  16.        if (activity instanceof LifecycleRegistryOwner) { 
  17.            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); 
  18.            return
  19.        } 
  20.        if (activity instanceof LifecycleOwner) { 
  21.            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle(); 
  22.            if (lifecycle instanceof LifecycleRegistry) { 
  23.                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); 
  24.            } 
  25.        } 
  26.    } 

7、 Lifecycle.State

State只有5個但是生命周期可是不止5個,所以Google他們設計時,就創建流程正著走,銷毀流程就反正走。

  1. Lifecycle.State 
  2.     /* Lifecycle.State */ 
  3.     public enum State { 
  4.         DESTROYED, 
  5.         INITIALIZED, 
  6.         CREATED, 
  7.         STARTED, 
  8.         RESUMED; 
  9.         public boolean isAtLeast(@NonNull State state) { 
  10.             return compareTo(state) >= 0; 
  11.         } 
  12.     } 

8、 handleLifecycleEvent

LifecycleRegistryOwner 也是繼承 LifecycleOwner,所以他們最后都會執行 LifecycleRegistry 的 handleLifecycleEvent 方法。

就是把 Lifecycle.Event處理一下,轉化成 Lifecycle.State

  1. /* Lifecycle.Event */ 
  2.       @NonNull 
  3.       public State getTargetState() { 
  4.           switch (this) { 
  5.               case ON_CREATE: 
  6.               case ON_STOP: 
  7.                   return State.CREATED; 
  8.               case ON_START: 
  9.               case ON_PAUSE: 
  10.                   return State.STARTED; 
  11.               case ON_RESUME: 
  12.                   return State.RESUMED; 
  13.               case ON_DESTROY: 
  14.                   return State.DESTROYED; 
  15.               case ON_ANY: 
  16.                   break; 
  17.           } 
  18.           throw new IllegalArgumentException(this + " has no target state"); 
  19.       } 
  20. Lifecycle.State 繼續往下傳,先用 mState 保存,再 sync 方法處理。 
  21.   /* LifecycleRegistry  */ 
  22.   public void handleLifecycleEvent(@NonNull Lifecycle.Event event) { 
  23.       enforceMainThreadIfNeeded("handleLifecycleEvent"); 
  24.       moveToState(event.getTargetState()); 
  25.   } 
  26.   private void moveToState(State next) { 
  27.       if (mState == next) { 
  28.           return
  29.       } 
  30.       //保存state狀態 
  31.       mState = next
  32.       if (mHandlingEvent || mAddingObserverCounter != 0) { 
  33.           mNewEventOccurred = true
  34.           // we will figure out what to do on upper level
  35.           return
  36.       } 
  37.       mHandlingEvent = true
  38.       sync(); 
  39.       mHandlingEvent = false
  40.   } 

9、 sync

這里利用上一個方法保存的mState,用于比較,判斷是正向執行還是反向執行生命周期

  1. /* LifecycleRegistry  */ 
  2.    private void sync() { 
  3.        //這是弱引用包裝過的LifecycleOwner  
  4.        LifecycleOwner lifecycleOwner = mLifecycleOwner.get(); 
  5.        if (lifecycleOwner == null) { 
  6.            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already" 
  7.                    + "garbage collected. It is too late to change lifecycle state."); 
  8.        } 
  9.        while (!isSynced()) { 
  10.            mNewEventOccurred = false
  11.            // no need to check eldest for nullability, because isSynced does it for us. 
  12.            //上一個方法保存的mState,跟組件之前的的mState對比 
  13.            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) { 
  14.                //返向執行流程 
  15.                backwardPass(lifecycleOwner); 
  16.            } 
  17.            Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest(); 
  18.            if (!mNewEventOccurred && newest != null 
  19.                    && mState.compareTo(newest.getValue().mState) > 0) { 
  20.                //正向執行流程 
  21.                forwardPass(lifecycleOwner); 
  22.            } 
  23.        } 
  24.        mNewEventOccurred = false
  25.    } 

10、 forwardPass

反向的邏輯差不多,只是執行 backwardPass ,先轉換Stata,最后執行 observer.dispatchEvent。

這里又把 Lifecycle.State 轉回 Lifecycle.Event,然后給觀察者分發出去。

  1. /* Lifecycle.Event */ 
  2.      @Nullable 
  3.      public static Event upFrom(@NonNull State state) { 
  4.          switch (state) { 
  5.              case INITIALIZED: 
  6.                  return ON_CREATE; 
  7.              case CREATED: 
  8.                  return ON_START; 
  9.              case STARTED: 
  10.                  return ON_RESUME; 
  11.              default
  12.                  return null
  13.          } 
  14.      } 

轉換 Event.upFrom ,發送 observer.dispatchEvent。

  1. /* LifecycleRegistry  */ 
  2.   private void forwardPass(LifecycleOwner lifecycleOwner) { 
  3.       Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> ascendingIterator = 
  4.               mObserverMap.iteratorWithAdditions(); 
  5.       while (ascendingIterator.hasNext() && !mNewEventOccurred) { 
  6.           Map.Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next(); 
  7.           ObserverWithState observer = entry.getValue(); 
  8.           while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred 
  9.                   && mObserverMap.contains(entry.getKey()))) { 
  10.               pushParentState(observer.mState); 
  11.               //轉化 
  12.               final Event event = Event.upFrom(observer.mState); 
  13.               if (event == null) { 
  14.                   throw new IllegalStateException("no event up from " + observer.mState); 
  15.               } 
  16.               //發送 
  17.               observer.dispatchEvent(lifecycleOwner, event); 
  18.               popParentState(); 
  19.           } 
  20.       } 
  21.   } 

11、 發送生命周期狀態

ObserverWithState 發送出 Lifecycle.Event ,至此就結束了,有注冊訂閱關系的地方就能收到

  1. static class ObserverWithState { 
  2.       State mState; 
  3.       LifecycleEventObserver mLifecycleObserver; 
  4.       ObserverWithState(LifecycleObserver observer, State initialState) { 
  5.           mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer); 
  6.           mState = initialState; 
  7.       } 
  8.       /* 分發生命周期狀態 */ 
  9.       void dispatchEvent(LifecycleOwner owner, Event event) { 
  10.           State newState = event.getTargetState(); 
  11.           mState = min(mState, newState); 
  12.           mLifecycleObserver.onStateChanged(owner, event); 
  13.           mState = newState; 
  14.       } 
  15.   } 

原理比較清晰:Activity/Fragment實現LifecycleOwner接口,通過LifecycleRegistry在對應生命周期分發事件Lifecycle.Event,回調到生命周期觀察者LifecycleObserver對應訂閱方法

圖片

總結

Lifecycle還是有可取之處的,相對于其它架構組件之間的配合,Lifecycle更簡單且獨立;

LifecycleObserver接口( Lifecycle觀察者):實現該接口的類,通過注解的方式,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件;

LifecycleOwner接口(Lifecycle持有者):實現該接口的類持有生命周期(Lifecycle對象),該接口的生命周期(Lifecycle對象)的改變會被其注冊的觀察者LifecycleObserver觀察到并觸發其對應的事件;

Lifecycle(生命周期):和LifecycleOwner不同的是,LifecycleOwner本身持有Lifecycle對象,LifecycleOwner通過其Lifecycle getLifecycle()的接口獲取內部Lifecycle對象;

State(當前生命周期所處狀態);

Event(當前生命周期改變對應的事件),當Lifecycle發生改變,如進入onCreate,會自動發出ON_CREATE事件;

后面會陸續介紹一些官方架構方面的知識點;

本文轉載自微信公眾號「Android開發編程」

 

責任編輯:姜華 來源: Android開發編程
相關推薦

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-09-07 06:40:25

AndroidLiveData原理

2021-09-01 06:48:16

AndroidGlide緩存

2024-08-30 10:40:12

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2021-09-08 06:51:52

AndroidRetrofit原理

2021-08-12 16:28:10

AndroidHandleLooper

2021-05-17 09:50:06

Kubebuilde源碼CURD

2022-01-05 08:53:13

Spring原理分析MVC

2019-09-20 08:54:38

KafkaBroker消息

2021-02-22 21:49:33

Vue動態組件

2021-08-05 20:39:34

AndroidKotlinStandard.kt

2021-08-09 11:15:28

MybatisJavaSpring

2021-11-26 17:17:43

Android廣播運行原理源碼分析

2011-05-26 10:05:48

MongoDB

2021-09-02 07:00:01

Glide流程Android

2021-07-06 09:29:38

Cobar源碼AST

2024-06-13 07:55:19

2021-03-23 09:17:58

SpringMVCHttpServletJavaEE

2021-09-12 07:30:10

配置
點贊
收藏

51CTO技術棧公眾號

中文字幕精品影院| 成人三级小说| 国产一区二区三区综合| 欧美国产日韩一区二区在线观看| 国产 xxxx| 成人免费一区| 亚洲午夜在线电影| 午夜午夜精品一区二区三区文| 国产女人18毛片水18精| 一区二区日韩免费看| 深夜成人在线观看| 国产亚洲色婷婷久久99精品91| 97成人超碰| 精品久久久久久国产91| 亚洲人成人77777线观看| 国产成人手机在线| 久久精品国产成人一区二区三区| 午夜精品一区二区三区在线| 黄色片网站在线播放| 欧美久久香蕉| 日韩视频不卡中文| 天天干天天爽天天射| 夜鲁夜鲁夜鲁视频在线播放| 亚洲一区二区三区在线免费| 午夜国产精品视频| 亚洲男人7777| 免费不卡的av| 精品视频在线观看免费观看| 色94色欧美sute亚洲线路一ni| 黄网站色视频免费观看| 日韩在线观看www| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 久久亚洲国产| 亚洲精品一二区| 一级黄色免费视频| 久久天堂久久| 欧美高清视频在线高清观看mv色露露十八 | 不卡的一区二区| 欧美v亚洲v综合v国产v仙踪林| 日韩欧美成人免费视频| 久久久久久久中文| 男插女视频久久久| 亚洲精品成人精品456| 台湾成人av| 国产高清美女一级毛片久久| 久久久久亚洲蜜桃| 欧美成人dvd在线视频| 日本激情一区二区三区| 成av人片一区二区| 国产精成人品localhost| 精品国产亚洲av麻豆| 狠狠网亚洲精品| 成人妇女免费播放久久久| 在线观看你懂的网站| 日韩激情在线观看| 国产精品1区2区在线观看| www.国产一区二区| 久久最新视频| 国产福利视频一区二区| 国产suv精品一区二区33| 久久精品天堂| 国产精品成人久久久久| 69视频免费看| 日本一区中文字幕| 国产精品网红福利| 国产美女裸体无遮挡免费视频 | 香蕉视频在线观看黄| 亚洲精品影片| 亚洲精品国精品久久99热| 先锋资源av在线| 蜜臀久久99精品久久一区二区| 亚洲美女av在线| 国产极品视频在线观看| 欧美在线黄色| 午夜精品在线观看| а中文在线天堂| 国模少妇一区二区三区| 99久久综合狠狠综合久久止| 四虎免费在线观看| 米奇777四色精品人人爽| 日韩在线一卡二卡| 欧洲专线二区三区| 亚洲一区第一页| 91大神福利视频| 伊人久久大香线| 久久久久免费视频| 黄色片中文字幕| 美女一区二区视频| av成人在线电影| 三级视频在线| 中文字幕在线观看不卡| 成人免费在线网| 黑人巨大精品欧美一区二区桃花岛| 欧美制服丝袜第一页| 国产传媒免费观看| 人人精品亚洲| 久久精品中文字幕免费mv| 日产电影一区二区三区| 日本成人中文字幕在线视频| 97久久夜色精品国产九色| 天堂在线中文字幕| 亚洲素人一区二区| 国产欧美在线一区| 二区三区精品| 亚洲社区在线观看| 免费视频一二三区| 欧美a级一区二区| 国产精品一区二区三区在线观| 国产黄色片在线播放| 亚洲图片欧美一区| 国产美女一区二区三区| 日韩av电影在线播放| 99视频免费看| 久久综合九色综合久久久精品综合 | 国产精品久久亚洲不卡| 欧美精品一区二区三区蜜桃 | 黄网站色欧美视频| 欧美在线a视频| 怕怕欧美视频免费大全| 久久免费福利视频| 国产人妻精品一区二区三区| 国产午夜精品久久久久久免费视 | 国产精品外国| 成人一区二区三区四区| 免费在线观看黄| 欧美午夜精品免费| 亚洲精品乱码久久久久久不卡| 亚洲精品国产首次亮相| 国产精品美女久久久久久免费| 日韩一级片免费| 一区二区三区视频在线看| 成人日韩在线视频| 精品国产a一区二区三区v免费| 66m—66摸成人免费视频| 精品国产av 无码一区二区三区| 中文字幕国产一区| 黑人粗进入欧美aaaaa| 妖精一区二区三区精品视频| 97视频在线免费观看| 免费国产精品视频| 亚洲午夜久久久| 国产精品一级无码| 欧美91视频| 99电影网电视剧在线观看| xvideos国产在线视频| 欧美日韩成人综合在线一区二区| 色欲AV无码精品一区二区久久| 先锋影音国产一区| 久久久久se| 在线观看爽视频| 精品亚洲国产成av人片传媒| 黄色大片网站在线观看| 91浏览器在线视频| 国产午夜福利在线播放| 色爱综合av| 欧美中文字幕视频在线观看| 日本在线视频1区| 精品国产乱码久久久久酒店| 艳妇乳肉亭妇荡乳av| 亚洲激情另类| 久久综合久久综合这里只有精品| 成人福利视频| 最近2019年日本中文免费字幕| 在线观看免费高清视频| 自拍偷拍亚洲激情| 女人扒开双腿让男人捅| 亚洲精品乱码| 久久香蕉综合色| 日本精品网站| 久久躁狠狠躁夜夜爽| 亚洲男人第一天堂| 五月天欧美精品| 色哟哟精品观看| 免费成人av在线播放| 五月天男人天堂| 亚洲国产aⅴ精品一区二区| 国语自产在线不卡| 黄色小视频在线免费观看| 欧美日韩国产综合久久| 欧美国产日韩综合| 91视频在线观看免费| 麻豆一区二区三区视频| 女生裸体视频一区二区三区| 国内一区在线| 91综合国产| 久久久亚洲国产天美传媒修理工| 蜜桃免费在线| 91精品国产综合久久精品app| 日韩av免费网址| 亚洲国产精品二十页| 永久av免费在线观看| 妖精视频成人观看www| 亚洲精品日韩成人| 久久精品66| 国产精品视频久久久久| freexxx性亚洲精品| 中文字幕免费国产精品| 亚洲AV无码精品色毛片浪潮| 欧洲亚洲精品在线| 久久久久久久久久91| 国产农村妇女毛片精品久久麻豆| xxxxwww一片| 免费成人美女在线观看| 成年人网站免费视频| 91九色精品| 欧美日韩国产三区| 9国产精品午夜| 亚洲国产一区二区三区在线播放| 国产欧美日韩视频| 台湾佬中文娱乐网欧美电影| 久久久精品亚洲| 国产精品视频一区二区久久| 精品国产不卡一区二区三区| 91片黄在线观看喷潮| 色综合久久88色综合天天免费| 欧美另类视频在线观看| 中文字幕av一区 二区| 男男做爰猛烈叫床爽爽小说 | 日韩欧美中文在线| 久久久久久久久97| 亚洲欧美国产高清| 精品一区二区6| 久久久久久亚洲综合| 亚洲av人人澡人人爽人人夜夜| 激情欧美日韩一区二区| 中文字幕第80页| 午夜亚洲视频| 日韩欧美国产免费| 亚洲午夜电影| 成人一区二区av| 亚洲天天综合| 一区二区三区四区欧美| 青青草综合网| 日韩欧美在线观看强乱免费| 免费一区二区三区视频导航| 国模精品娜娜一二三区| 99re6热只有精品免费观看| 97se国产在线视频| 日本高清精品| 成人免费看片网站| 一区三区自拍| 国产91精品一区二区绿帽| 午夜视频在线观看精品中文| 91色精品视频在线| www.欧美| 亚洲综合国产精品| 日本精品视频| 国产高清自拍99| 国产伦精品一区二区三区在线播放 | 久久久久久久久久久久久夜| 人妻熟女aⅴ一区二区三区汇编| 成人国产精品免费网站| 黑丝av在线播放| 91片在线免费观看| 香蕉视频久久久| 亚洲国产精品二十页| 最新黄色av网址| 亚洲精选在线视频| 免费麻豆国产一区二区三区四区| 一区二区激情小说| 日韩精品一区二区三| 日韩欧美高清视频| 国产一级片免费在线观看| 在线国产亚洲欧美| 国产精品国产精品国产专区| 91麻豆精品国产91久久久资源速度 | 久久久久久黄| 天堂社区在线视频| 久久66热偷产精品| 国产情侣久久久久aⅴ免费| 成人黄色网址在线观看| 人人妻人人澡人人爽人人精品 | 亚洲妇女成熟| 国产福利视频一区| 美国十次综合久久| 国产丝袜不卡| 欧美综合久久| 天天做天天躁天天躁| 亚洲欧美日韩一区在线观看| 欧美日韩一区二区三区69堂| 国产乱码精品1区2区3区| 小毛片在线观看| 中文字幕av资源一区| 久久婷婷一区二区| 色婷婷综合视频在线观看| 国产精品久久久久久无人区 | 3d精品h动漫啪啪一区二区| av综合网站| 精品一区日韩成人| 久久亚洲国产| 欧美在线观看www| 久久福利视频一区二区| 男女一区二区三区| 国产精品久久久久久久第一福利 | 99视频在线| 欧美日韩xxxx| 欧美午夜性视频| 蜜桃av噜噜一区| 年下总裁被打光屁股sp | 免费成人直播| 91成人在线看| 精品久久不卡| 欧美成人三级在线视频| 狠狠久久亚洲欧美| 色无极影院亚洲| 亚洲一区二区免费视频| 中文字幕视频二区| 精品亚洲一区二区三区四区五区| 超碰在线观看免费版| 国产精品九九久久久久久久| 欧美色图一区二区| 日韩精彩视频在线观看| yjizz视频| 亚洲欧美日韩国产另类专区| 国产美女激情视频| 日韩一区二区电影| 在线观看免费黄色| 国产成人精品电影| 性人久久久久| 成人一区二区免费视频| 国内不卡的二区三区中文字幕 | 美腿丝袜亚洲图片| 国产成人一二三区| 国产毛片一区二区| 亚洲少妇xxx| 欧美日韩国产综合一区二区三区| 久久精品蜜桃| 欧美亚洲成人免费| 欧美成a人免费观看久久| 免费在线黄网站| 国产精品综合久久| 少妇aaaaa| 91精品国产麻豆国产自产在线 | 亚洲综合久久av| 91极品身材尤物theporn| 亚洲人成绝费网站色www| 女人高潮被爽到呻吟在线观看| 粉嫩av四季av绯色av第一区| 欧美精品二区| 精品无码av一区二区三区不卡| 亚洲色图在线看| av网站在线观看免费| 久久久999国产精品| 国产999精品在线观看| 亚洲最大色综合成人av| 精品一区二区三区久久久| 天天操天天摸天天舔| 欧美精品乱人伦久久久久久| 男人天堂久久久| 国产日本欧美视频| 99热在线成人| 四川一级毛毛片| 亚洲国产精品麻豆| 天天干天天舔天天射| 欧美一区二区色| 精品国产一区探花在线观看| 五月天婷婷激情视频| 亚洲欧洲av另类| 精品国产乱码久久久久久蜜臀网站| 欧美高清一级大片| 欧美午夜18电影| 国产成人av影视| 亚洲欧洲精品一区二区三区| 国产乱码久久久| 久久久欧美一区二区| 亚洲人成网www| 亚洲天堂2018av| 亚洲欧美成人一区二区三区| 亚洲av永久无码国产精品久久| 国自在线精品视频| 欧美激情在线精品一区二区三区| 久久精品视频91| 亚洲三级在线看| 深爱五月激情五月| 国产精品久久久久不卡| 91综合久久| 少妇被狂c下部羞羞漫画| 色婷婷久久99综合精品jk白丝 | 国精产品一区一区三区有限在线| 天堂网av成人| 男生操女生视频在线观看| 亚洲午夜羞羞片| youjizz在线播放| 91久久精品www人人做人人爽 | 亚洲一卡二卡三卡四卡| 深夜福利在线观看直播| 国产欧美一区二区白浆黑人| 女同性一区二区三区人了人一| 99re久久精品国产| 欧美日韩精品福利| av资源网在线播放| 亚洲一区bb| 99re热这里只有精品免费视频| 在线观看国产成人| 97久久国产精品| 欧美gay男男猛男无套| 日本japanese极品少妇| 在线播放中文字幕一区| 周于希免费高清在线观看| 女人床在线观看|