精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲午夜一二三区视频| 日本网站在线观看一区二区三区| 日韩欧美色电影| xxxx18hd亚洲hd捆绑| 欧美视频综合| 蜜桃91丨九色丨蝌蚪91桃色| 欧美国产亚洲视频| 色噜噜日韩精品欧美一区二区| 开心久久婷婷综合中文字幕 | 天天天天天天天天操| 欧美a级网站| 欧美片网站yy| 黄色成人在线看| 欧美激情办公室videoshd| 99久久久免费精品国产一区二区| 国产日韩精品视频| 国语对白永久免费| 亚洲一级黄色| 久久精品国产一区二区三区| 亚洲午夜福利在线观看| **爰片久久毛片| 欧美日韩一二区| 六月丁香婷婷激情| 欧美草逼视频| 国产精品成人免费| 日本视频精品一区| 空姐吹箫视频大全| 国产不卡高清在线观看视频| 国产精品吴梦梦| 亚洲综合图片网| 亚洲精品1区2区| 欧美日韩成人在线播放| 91传媒免费观看| 日韩在线高清| 国产亚洲精品美女久久久久| 久久久久亚洲AV成人无码国产| 精品999日本久久久影院| 欧美日韩三级一区二区| 国产男女激情视频| 345成人影院| 丁香五六月婷婷久久激情| 欧美一级视频在线播放| 日本动漫同人动漫在线观看| 亚洲精品精品亚洲| 警花观音坐莲激情销魂小说| 黄色视屏免费在线观看| 国产精品理论片| 亚洲欧洲久久| 日本天堂在线观看| 一区在线中文字幕| 国产又粗又爽又黄的视频| 黄色大片在线播放| 综合分类小说区另类春色亚洲小说欧美| 日韩av免费电影| 国产精品免费播放| 国产精品久久久久久久久免费桃花 | 国产欧美日韩综合精品一区二区| 欧美日韩精品久久| 国内三级在线观看| 国产精品久久午夜| 天天做天天爱天天高潮| 亚洲性图自拍| 亚洲午夜免费福利视频| 国产视频九色蝌蚪| 视频二区不卡| 欧美日韩成人在线一区| 国产探花在线观看视频| 中文在线综合| 亚洲精品动漫100p| 99国产精品免费| 亚洲精品二区三区| 久久久久国产精品免费网站| 中国一级特黄毛片| 日韩av不卡在线观看| 国产色综合天天综合网 | 国产成人av电影在线| 国产一区二区不卡视频在线观看| 日本一区高清| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲一区三区电影在线观看| 在线观看小视频| 偷拍日韩校园综合在线| 中文字幕第80页| 日本在线视频一区二区三区| 亚洲成人aaa| 日韩不卡av在线| 欧美视频成人| 欧美亚洲在线播放| 在线视频 中文字幕| 国产福利不卡视频| 精品在线不卡| 久草免费在线观看| 精品美女永久免费视频| 亚洲欧洲日本精品| 久久av二区| 91成人综合网| 99热99re6国产在线播放| 精品动漫一区二区| 手机看片福利日韩| 婷婷综合国产| 亚洲人成网站777色婷婷| 国产性生活大片| 99精品免费视频| 国产日韩在线观看av| 四虎永久在线精品免费网址| 国产精品欧美极品| 2018日日夜夜| 亚洲国产aⅴ精品一区二区三区| 欧美大肚乱孕交hd孕妇| 国产精品综合激情| 99精品国产一区二区青青牛奶| 国产主播精品在线| 日韩美女一级视频| 亚洲精品五月天| 亚洲成人av免费看| 啪啪激情综合网| 欧美老少做受xxxx高潮| 少妇无套内谢久久久久| thepron国产精品| 青青草影院在线观看| 3d欧美精品动漫xxxx无尽| 精品免费一区二区三区| 久久国产美女视频| 奇米色一区二区| 久久亚洲一区二区| 91桃色在线观看| 日韩精品一区二区三区三区免费| 国产黄a三级三级| 久久激情视频| 久久天天狠狠| 国产精品25p| 欧美精品一区二区三| 国产一二三区精品| 久久99精品国产.久久久久| 日本亚洲导航| 成人福利av| 日韩精品亚洲元码| 免费看日韩毛片| 成人18精品视频| 99视频精品全部免费看| 香蕉成人在线| 一区二区av在线| 国产性生活视频| 久久久综合九色合综国产精品| 久久久久久人妻一区二区三区| 亚洲精品一区二区三区中文字幕| 久久精品视频播放| 国产又粗又猛视频| 国产精品国产三级国产a| 91色国产在线| 999精品视频| 91久久国产综合久久91精品网站| 日本在线观看网站| 91精选在线观看| 黄色一级片中国| 国产69精品久久久久777| 一二三四中文字幕| 综合伊人久久| 97人人做人人爱| 日本韩国精品一区二区| 色av成人天堂桃色av| 谁有免费的黄色网址| 日本vs亚洲vs韩国一区三区二区 | 亲子伦视频一区二区三区| 久久久视频免费观看| 污视频软件在线观看| 欧美日韩一区二区三区| 白白色免费视频| 看国产成人h片视频| 国产手机视频在线观看| 精品国产一区二区三区成人影院| 91超碰中文字幕久久精品| 欧美日韩免费观看一区二区三区| 成人黄色在线免费| 欧美r级在线| 欧美一区二区三区成人| 国产极品美女高潮无套嗷嗷叫酒店| 粉嫩av亚洲一区二区图片| 成人一区二区免费视频| 国产乱码精品一区二区亚洲| 国产精品第一视频| www.在线视频| 日韩精品中文字幕有码专区| 中文字字幕在线观看| 亚洲丝袜另类动漫二区| 亚洲精品乱码久久久久久蜜桃欧美| 亚洲欧美日韩国产| 樱花www成人免费视频| 91精品国产自产精品男人的天堂| 欧美一级片一区| 美女黄视频在线观看| 亚洲韩国日本中文字幕| 中文字幕久久网| 亚洲.国产.中文慕字在线| 日本美女xxx| 高清不卡一区二区在线| 人人爽人人av| 激情综合激情| 一区二区在线观| 麻豆国产欧美一区二区三区r| 国产精品99久久久久久久久久久久 | 欧美日韩最好看的视频| 成人av在线播放| 欧美做受高潮1| 国产原创视频在线观看| 亚洲人成电影网站色…| 国精产品一品二品国精品69xx| 欧美在线观看你懂的| 日本少妇性高潮| 亚洲九九爱视频| 亚洲色图第四色| 91亚洲午夜精品久久久久久| 亚洲欧美一区二区三区不卡| 秋霞午夜av一区二区三区| 国产精品网站免费| 欧美aⅴ99久久黑人专区| 日韩免费电影一区二区| 日韩三区视频| 国产伦精品一区二区三毛| www欧美在线观看| 国产精品视频午夜| 欧美性suv| 欧美一级视频免费在线观看| 成人性生交大片免费看在线播放| 久久久91精品| 日本在线免费播放| 中国人与牲禽动交精品| 日夜干在线视频| 亚洲精品久久久久中文字幕欢迎你 | 蜜桃av在线播放| 久久久久国产精品www| caoporm免费视频在线| 色爱av美腿丝袜综合粉嫩av| 国产一级免费在线观看| 亚洲欧美日韩爽爽影院| 天天操天天干天天爱| 亚洲第一福利在线观看| 丰满人妻妇伦又伦精品国产| 欧美大片一区二区| 亚洲精品国产一区二| 日韩美女视频在线| www.av黄色| 日韩欧美资源站| 亚洲AV无码精品国产| 日韩欧美国产三级电影视频| 精品国产无码一区二区三区| 91精品福利在线一区二区三区| 91麻豆成人精品国产免费网站| 欧美日韩黄视频| 国产又粗又猛又黄| 日韩午夜激情视频| 亚洲国产中文字幕在线| 亚洲电影免费观看高清| 欧美一级片免费| 日韩精品高清在线| 玖玖综合伊人| 日韩亚洲第一页| 成人日韩欧美| 久久久中精品2020中文| 精品极品在线| 国产999精品久久久| 国产a亚洲精品| 成人久久久久久| 色妞ww精品视频7777| 国产精品综合久久久久久| 亚洲欧洲免费| 中文字幕欧美日韩一区二区三区 | 欧美激情精品久久久久久蜜臀 | 国产剧情日韩欧美| 97色婷婷成人综合在线观看| 99国精产品一二二线| 欧美三级电影在线| 亚洲 国产 欧美一区| 伊人情人综合网| 国产精品网站免费| 免播放器亚洲一区| 日韩精品xxx| 久久综合成人精品亚洲另类欧美| 免费看91的网站| 亚洲欧美欧美一区二区三区| 日韩精品一区二区三| 91日韩精品一区| 一区二区精品国产| 综合久久99| 国产精品网站免费| 男人的天堂亚洲一区| 中日韩午夜理伦电影免费 | 亚洲av无码一区二区三区在线| 一区二区国产视频| 樱花视频在线免费观看| 这里只有精品电影| 你懂的免费在线观看视频网站| 日韩中文字幕免费| 久久男人天堂| 成人亚洲综合色就1024| 美女午夜精品| 四虎影院一区二区| 美女久久一区| 亚洲少妇一区二区| 中文字幕在线一区免费| 五月天婷婷综合网| 91精品国产综合久久久蜜臀图片| 全色精品综合影院| 欧美大尺度在线观看| 欧洲亚洲两性| 国产精品视频福利| 欧美国产一级| 那种视频在线观看| 成人免费精品视频| 黄色录像一级片| 91国产精品成人| 色噜噜一区二区三区| 欧美另类第一页| 青青青国产精品| 日韩动漫在线观看| 亚洲欧美bt| 欧美一级片黄色| 伊人夜夜躁av伊人久久| 在线播放成人av| 亚洲无av在线中文字幕| 国产传媒在线观看| 国产精品精品软件视频| 欧美成人高清| 99视频在线观看视频| 中文在线资源观看网站视频免费不卡| 欧美一二三区视频| 精品国产三级电影在线观看| av大片在线| 91夜夜未满十八勿入爽爽影院 | 中文字幕一区2区3区| 亚洲久久久久久久久久| 国产乱码午夜在线视频| 国产91社区| 欧美黄色大片网站| 久久久久久久久久毛片| 中文字幕一区二区在线观看| 成人一级免费视频| 国产一区二区久久精品| 日韩伦理三区| 日韩精品久久一区二区三区| 久久福利一区| 69视频在线观看免费| 日本道精品一区二区三区| 精品美女视频在线观看免费软件| 欧美亚洲在线观看| 综合成人在线| 欧美一级片免费在线| 精品久久ai| 97干在线视频| av欧美精品.com| 日韩美女视频网站| 日韩精品极品在线观看播放免费视频| 蜜臀久久精品| 欧美在线视频一区二区三区| 蜜桃久久久久久| 小泽玛利亚一区| 精品久久久久一区二区国产| 黄色片网站在线免费观看| 亚洲视频中文字幕| 一二三四区视频| 久久综合久久八八| 久久久91麻豆精品国产一区| 国产在线拍揄自揄拍无码| 国产sm精品调教视频网站| 日本视频www| 亚洲毛片在线观看| 成人黄页网站视频| 91视频成人免费| 成人国产亚洲欧美成人综合网| 欧美一区三区二区在线观看| 亚洲在线一区| 色噜噜噜噜噜噜| 欧美一区二区三区在线看| 国产高清在线a视频大全| 久久青青草综合| 九九九久久久精品| 国产在线视频第一页| 亚洲欧美中文另类| 国产95亚洲| 少妇高潮毛片色欲ava片| 国产欧美一区视频| 精品国产999久久久免费| 欧美一区在线直播| 97精品在线| 中文字幕在线播放视频| 欧美日韩三级在线| 24小时免费看片在线观看| 色吧亚洲视频| 成人毛片在线观看| 五月婷婷激情五月| 欧美国产日韩一区二区三区| 少妇一区二区视频| 欧美日韩久久婷婷| 色综合色综合色综合色综合色综合 | 日本一区二区三区四区五区六区| 不卡av在线免费观看| 中文字幕在线视频第一页| 91成人性视频| 欧美大片一区| 天堂а√在线中文在线鲁大师|