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

Android源碼進(jìn)階之LiveData工作原理詳解

移動(dòng)開(kāi)發(fā) Android
LiveData 是一種可觀察的數(shù)據(jù)存儲(chǔ)器類。與常規(guī)的可觀察類不同,LiveData 具有生命周期感知能力,意指它遵循其他應(yīng)用組件(如 Activity、Fragment 或 Service)的生命周期。

[[422179]]

本文轉(zhuǎn)載自微信公眾號(hào)「Android開(kāi)發(fā)編程」,作者Android開(kāi)發(fā)編程。轉(zhuǎn)載本文請(qǐng)聯(lián)系A(chǔ)ndroid開(kāi)發(fā)編程公眾號(hào)。

前言

LiveData 是一種可觀察的數(shù)據(jù)存儲(chǔ)器類。與常規(guī)的可觀察類不同,LiveData 具有生命周期感知能力,意指它遵循其他應(yīng)用組件(如 Activity、Fragment 或 Service)的生命周期。

這種感知能力可確保 LiveData 僅更新處于活躍生命周期狀態(tài)的應(yīng)用組件觀察者。

LiveData本身是觀察者,觀察組件的Lifecycle,也是被觀察者,數(shù)據(jù)變化時(shí)要通知數(shù)據(jù)的觀察者。

前面我們講解了Lifecycle實(shí)現(xiàn)原理,今天我們來(lái)看LiveData

源碼進(jìn)階之lifecycle組件原理分析

一、livedata的在app中的應(yīng)用

1、使用livedata的步驟

  • 創(chuàng)建一個(gè)實(shí)例LiveData來(lái)保存某種類型的數(shù)據(jù)。這通常在你的ViewModel類內(nèi)完成;
  • 創(chuàng)建一個(gè)Observer 定義onChanged()方法的對(duì)象,該對(duì)象 控制LiveData對(duì)象保存的數(shù)據(jù)更改時(shí)發(fā)生的情況。您通常Observer在UI控制器中創(chuàng)建對(duì)象,例如activity或fragment;
  • 使用該 方法將Observer對(duì)象附加到對(duì)象。該方法需要一個(gè)對(duì)象。這將對(duì)象訂閱到對(duì)象,以便通知其更改。您通常將該對(duì)象附加到UI控制器中,例如活動(dòng)或片段;

2、livedata的簡(jiǎn)單例子

在viewModel中之定義live data

  1. public class NameViewModel extends ViewModel { 
  2. // Create a LiveData with a String 
  3. private MutableLiveData<String> mCurrentName; 
  4.     public MutableLiveData<String> getCurrentName() { 
  5.         if (mCurrentName == null) { 
  6.             mCurrentName = new MutableLiveData<String>(); 
  7.         } 
  8.         return mCurrentName; 
  9.     } 
  10. // Rest of the ViewModel... 

在activity或者Fragment中實(shí)施監(jiān)聽(tīng)來(lái)更新ui

  1. public class NameActivity extends AppCompatActivity { 
  2.     private NameViewModel mModel; 
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         // Other code to setup the activity... 
  7.         // Get the ViewModel. 
  8.         mModel = ViewModelProviders.of(this).get(NameViewModel.class); 
  9.         // Create the observer which updates the UI. 
  10.         final Observer<String> nameObserver = new Observer<String>() { 
  11.             @Override 
  12.             public void onChanged(@Nullable final String newName) { 
  13.                 // Update the UI, in this case, a TextView. 
  14.                 mNameTextView.setText(newName);    
  15.                  //注意這里 在MVVM 中不是這樣寫(xiě)的 這里只是單行綁定 
  16.             } 
  17.         }; 
  18.         // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer. 
  19.         mModel.getCurrentName().observe(this, nameObserver);      
  20.         //注意這個(gè)地方用沒(méi)有用Java8的lambda表達(dá)式,可以寫(xiě)的更加簡(jiǎn)練, 
  21.     } 

更新livedata對(duì)象

調(diào)用setValue(T)示例會(huì)導(dǎo)致觀察者onChanged()使用該值調(diào)用其ui進(jìn)行刷新。該示例示出了按鈕按下,但setValue()還是postValue()可以被調(diào)用以更新mName為各種各樣的原因,包括響應(yīng)于網(wǎng)絡(luò)請(qǐng)求或數(shù)據(jù)庫(kù)負(fù)荷完成; 在所有情況下,呼叫setValue()或postValue()觸發(fā)觀察員并更新UI;

  1. mButton.setOnClickListener(new OnClickListener() { 
  2.     @Override 
  3.     public void onClick(View v) { 
  4.         String anotherName = "John Doe"
  5.         mModel.getCurrentName().setValue(anotherName); 
  6.     } 
  7. }); 
  8. mButton.setOnClickListener(new OnClickListener() { 
  9.     @Override 
  10.     public void onClick(View v) { 
  11.         String anotherName = "John Doe"
  12.         mModel.getCurrentName().setValue(anotherName); 
  13.     } 
  14. }); 

二、livedata原理詳細(xì)分析

1、observe 方法

  • 首先這個(gè)方法只能在主線程注冊(cè)觀察;
  • 官方文檔說(shuō)LiveData僅處于活躍生命周期才有效,所以一開(kāi)始就開(kāi)始判斷是否為 Lifecycle.Stete.DESTROYED,是的話就沒(méi)有然后了,直接return;
  • 接下來(lái)就是 創(chuàng)建 LifecycleBoundObserver ,生命周期變化邏輯在這里面;
  • 然后就是最后一行注冊(cè)觀察,如果想了解 Lifecycle.addObserver 做了什么可以看 Android Lifecycle實(shí)現(xiàn)原理;
  1. //map 的 key 為L(zhǎng)iveData數(shù)據(jù)觀察者,value為組件的Lifecycle觀察者 
  2.     private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers = 
  3.             new SafeIterableMap<>(); 
  4.     @MainThread 
  5.     public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { 
  6.         assertMainThread("observe"); 
  7.         //判斷當(dāng)前生命周期的狀態(tài) 
  8.         if (owner.getLifecycle().getCurrentState() == DESTROYED) { 
  9.             // ignore 
  10.             return
  11.         } 
  12.         //Lifecycle的生命周期變化邏輯在這里 
  13.         LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); 
  14.         //mObservers 保存 
  15.         ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); 
  16.         if (existing != null && !existing.isAttachedTo(owner)) { 
  17.             throw new IllegalArgumentException("Cannot add the same observer" 
  18.                     + " with different lifecycles"); 
  19.         } 
  20.         if (existing != null) { 
  21.             return
  22.         } 
  23.         //感知lifecycle的生命周期變化 
  24.         owner.getLifecycle().addObserver(wrapper); 
  25.     } 

2、LifecycleBoundObserver

  • LifecycleBoundObserver 繼承 ObserverWrapper ,實(shí)現(xiàn) LifecycleEventObserver 接口。
  • ObserverWrapper 用于判斷組件當(dāng)前是否活躍;
  • LifecycleEventObserver 就是 Lifecycle 的觀察者了,重寫(xiě)了 onStateChanged 方法,當(dāng)Lifecycle 生命周期發(fā)生變化時(shí),就會(huì)在此方法接收到,LiveData 也就能感知到,如果組件的生命周期是 DESTROYED ,那也就移除觀察;
  • 到這里 LiveData 對(duì)組件的生命周期感知就注冊(cè)完成了,可以開(kāi)始發(fā)送數(shù)據(jù);
  1. class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver { 
  2.         @NonNull 
  3.         //一般組件,比如Activity、fragment可以會(huì)實(shí)現(xiàn)LifecycleOwner ,可以拿到lifecycle 
  4.         final LifecycleOwner mOwner; 
  5.         LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) { 
  6.             super(observer); 
  7.             mOwner = owner; 
  8.         } 
  9.         /* 判斷當(dāng)前組件當(dāng)前是否活躍 */ 
  10.         @Override 
  11.         boolean shouldBeActive() { 
  12.             return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED); 
  13.         } 
  14.         @Override 
  15.         public void onStateChanged(@NonNull LifecycleOwner source, 
  16.                 @NonNull Lifecycle.Event event) { 
  17.             //獲取當(dāng)前生命周期狀態(tài) 
  18.             Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState(); 
  19.             //如果組件已銷毀了,就移除觀察 
  20.             if (currentState == DESTROYED) { 
  21.                 removeObserver(mObserver); 
  22.                 return
  23.             } 
  24.             Lifecycle.State prevState = null
  25.             while (prevState != currentState) { 
  26.                 prevState = currentState; 
  27.                 activeStateChanged(shouldBeActive()); 
  28.                 currentState = mOwner.getLifecycle().getCurrentState(); 
  29.             } 
  30.         } 
  31.         /* 判斷是否綁定 */ 
  32.         @Override 
  33.         boolean isAttachedTo(LifecycleOwner owner) { 
  34.             return mOwner == owner; 
  35.         } 
  36.         /* 移除觀察 */ 
  37.         @Override 
  38.         void detachObserver() { 
  39.             mOwner.getLifecycle().removeObserver(this); 
  40.         } 
  41.     } 

3、activeStateChanged

ObserverWrapper 這個(gè)類里面有個(gè)方法,后面的粘性事件會(huì)用到;

  1. void activeStateChanged(boolean newActive) { 
  2.             //組件狀態(tài)如果不變返回 
  3.             if (newActive == mActive) { 
  4.                 return
  5.             } 
  6.             // immediately set active state, so we'd never dispatch anything to inactive 
  7.             // owner 
  8.             mActive = newActive; 
  9.             changeActiveCounter(mActive ? 1 : -1); 
  10.             //如果是活動(dòng)的就發(fā)送數(shù)據(jù) 
  11.             if (mActive) { 
  12.                 dispatchingValue(this); 
  13.             } 
  14.         } 

4、發(fā)送數(shù)據(jù)分析

4.1、postValue 發(fā)送數(shù)據(jù)到主線程

這個(gè)方法最核心的就是利用主線程Handler發(fā)送數(shù)據(jù),一步步拆開(kāi)分析;

  1. protected void postValue(T value) { 
  2.         boolean postTask; 
  3.         //加鎖 
  4.         synchronized (mDataLock) { 
  5.             postTask = mPendingData == NOT_SET; 
  6.             //保存要發(fā)送的數(shù)據(jù)value 
  7.             mPendingData = value; 
  8.         } 
  9.         if (!postTask) { 
  10.             return
  11.         } 
  12.         //利用主線程Handler發(fā)送 
  13.         ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable); 
  14.     } 

4.2、postValue 其實(shí)就是 setValue

在postValue 要發(fā)送的 Runnable ,可以看到最后一行就是 setValue 方法,數(shù)據(jù)也即是之前保存的mPendingData ,只是在這又給 newValue;

  1. private final Runnable mPostValueRunnable = new Runnable() { 
  2.         @SuppressWarnings("unchecked"
  3.         @Override 
  4.         public void run() { 
  5.             Object newValue; 
  6.             synchronized (mDataLock) { 
  7.                 newValue = mPendingData; 
  8.                 mPendingData = NOT_SET; 
  9.             } 
  10.             setValue((T) newValue); 
  11.         } 
  12.     }; 

4.3、postToMainThread 主線程Handler

ArchTaskExecutor 類 postToMainThread 方法,實(shí)際就是 DefaultTaskExecutor 類執(zhí)行 postToMainThread 方法;

  1. public class ArchTaskExecutor extends TaskExecutor { 
  2.     @NonNull 
  3.     private TaskExecutor mDelegate; 
  4.     @NonNull 
  5.     private TaskExecutor mDefaultTaskExecutor; 
  6.     private ArchTaskExecutor() { 
  7.         mDefaultTaskExecutor = new DefaultTaskExecutor(); 
  8.         mDelegate = mDefaultTaskExecutor; 
  9.     } 
  10.     ... 
  11.     @Override 
  12.     public void postToMainThread(Runnable runnable) { 
  13.         mDelegate.postToMainThread(runnable); 
  14.     } 
  15.     ... 

4.4、DefaultTaskExecutor類

我們知道是 DefaultTaskExecutor. postToMainThread,就直接看這個(gè)方法,哎呀,太熟悉的代碼,創(chuàng)建 Handler ,傳入的是 Looper.getMainLooper() ,就是主線程Handler ,然后就 post 消息;

  1. public class DefaultTaskExecutor extends TaskExecutor { 
  2.     @Nullable 
  3.     private volatile Handler mMainHandler; 
  4.     @Override 
  5.     public void postToMainThread(Runnable runnable) { 
  6.         if (mMainHandler == null) { 
  7.             synchronized (mLock) { 
  8.                 if (mMainHandler == null) { 
  9.                     mMainHandler = createAsync(Looper.getMainLooper()); 
  10.                 } 
  11.             } 
  12.         } 
  13.         //noinspection ConstantConditions 
  14.         mMainHandler.post(runnable); 
  15.     } 

4.5、setValue 方法

mVersion 在初始化的構(gòu)造方法里就賦值了,為-1,每次setValue,版本號(hào)就會(huì)變一次;

setValue 也就是用 mData 保存一下 value ,然后交給 dispatchingValue 方法處理;

  1. @MainThread 
  2.     protected void setValue(T value) { 
  3.         assertMainThread("setValue"); 
  4.         mVersion++; 
  5.         mData = value; 
  6.         dispatchingValue(null); 
  7.     } 

4.6、dispatchingValue 方法

setValue走該方法,傳的 initiator為空,那就遍歷 mObservers 保存的觀察者發(fā)送數(shù)據(jù);

  1. @SuppressWarnings("WeakerAccess") /* synthetic access */ 
  2.     void dispatchingValue(@Nullable ObserverWrapper initiator) { 
  3.         if (mDispatchingValue) { 
  4.             mDispatchInvalidated = true
  5.             return
  6.         } 
  7.         mDispatchingValue = true
  8.         do { 
  9.             mDispatchInvalidated = false
  10.             if (initiator != null) { 
  11.                 //粘性事件,就單個(gè)觀察者接受數(shù)據(jù) 
  12.                 considerNotify(initiator); 
  13.                 initiator = null
  14.             } else { 
  15.                 //setvalue 傳過(guò)來(lái) initiator 為空,執(zhí)行這里 
  16.                 // mObservers 拿出來(lái),逐個(gè)發(fā)送數(shù)據(jù) 
  17.                 for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator = 
  18.                         mObservers.iteratorWithAdditions(); iterator.hasNext(); ) { 
  19.                     considerNotify(iterator.next().getValue()); 
  20.                     if (mDispatchInvalidated) { 
  21.                         break; 
  22.                     } 
  23.                 } 
  24.             } 
  25.         } while (mDispatchInvalidated); 
  26.         mDispatchingValue = false
  27.     } 

4.7、considerNotify 判斷發(fā)送數(shù)據(jù)

  • 這里先判斷組件是否活動(dòng)
  • 在判斷粘性事件
  • 然后用 mVersion ,判斷是否發(fā)送過(guò)數(shù)據(jù)
  • 最后才是給觀察者發(fā)送數(shù)據(jù)
  1. private void considerNotify(ObserverWrapper observer) { 
  2.         //組件是否活動(dòng) 
  3.         if (!observer.mActive) { 
  4.             return
  5.         } 
  6.         // Check latest state b4 dispatch. Maybe it changed state but we didn't get the event yet. 
  7.         // 
  8.         // we still first check observer.active to keep it as the entrance for events. So even if 
  9.         // the observer moved to an active state, if we've not received that event, we better not 
  10.         // notify for a more predictable notification order
  11.         //判斷粘性事件 
  12.         if (!observer.shouldBeActive()) { 
  13.             observer.activeStateChanged(false); 
  14.             return
  15.         } 
  16.         //校驗(yàn)是否發(fā)送過(guò)數(shù)據(jù) 
  17.         if (observer.mLastVersion >= mVersion) { 
  18.             return
  19.         } 
  20.         observer.mLastVersion = mVersion; 
  21.         //發(fā)送數(shù)據(jù) 
  22.         observer.mObserver.onChanged((T) mData); 
  23.     } 

5、粘性事件分析

  • 粘性事件就是先發(fā)送數(shù)據(jù),后面再注冊(cè)觀察者,還能收到消息;
  • 我們就從LiveData.observe 開(kāi)始,新的頁(yè)面注冊(cè)LiveData觀察者,也注冊(cè)Lifecycle觀察;
  • 當(dāng)新頁(yè)面生命周期變化,就會(huì)執(zhí)行 LifecycleBoundObserver.onStateChanged 的方法;
  • 接下來(lái) activeStateChanged 方法,因?yàn)槭切马?yè)面,組件狀態(tài)是活動(dòng)的,就走到 dispatchingValue 方法;
  • dispatchingValue 傳進(jìn)來(lái)當(dāng)前新頁(yè)面的 initiator 是不為空的,就只會(huì)給當(dāng)前觀察者發(fā)送數(shù)據(jù);

總結(jié):

1、LifecycleOwner生命周期從非活躍變成活躍狀態(tài)時(shí):

Livedata添加一個(gè)觀察者時(shí),會(huì)關(guān)聯(lián)一個(gè)LifecycleOwner,然后把這個(gè)觀察者包裝成一個(gè)LifecycleBoundObserver,和LifecycleOwner的getLifecycle關(guān)聯(lián),當(dāng)LifecycleBoundObserver的生命周期變化時(shí),會(huì)調(diào)用LifecycleBoundObserver的onStateChanged方法,在這個(gè)方法中判斷當(dāng)前生命周期和上次的生命周期是否是同一類型(要么活躍要么非活躍),如果是,就直接返回,避免重復(fù)通知(start通知了,resume就不需要通知了),如果不是同一類型,并且當(dāng)前生命周期是活躍狀態(tài),就調(diào)用dispatchingValue方法通知觀察者,判斷LifecycleOwner是否時(shí)活躍狀態(tài),如果是,將Livedata中持有的最新更新給觀察者;

2、Livedata中的值改變時(shí):

 

同樣是調(diào)用dispatchingValue,判斷LifecycleOwner是否時(shí)活躍狀態(tài),如果是,就遍歷通知所有觀察者;

 

責(zé)任編輯:武曉燕 來(lái)源: Android開(kāi)發(fā)編程
相關(guān)推薦

2021-09-01 06:48:16

AndroidGlide緩存

2021-09-08 06:51:52

AndroidRetrofit原理

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-09-02 07:00:01

Glide流程Android

2021-08-05 20:39:34

AndroidKotlinStandard.kt

2021-08-10 20:41:33

AndroidApp流程

2021-09-05 07:35:58

lifecycleAndroid組件原理

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2021-08-17 13:41:11

AndroidView事件

2021-09-12 07:30:10

配置

2021-09-03 07:27:38

AndroidGlide管理

2021-08-09 20:29:27

Android沉浸式狀態(tài)欄

2021-08-25 07:43:17

AndroidSurfaceViewTextureView

2021-09-06 13:12:05

前端JavaScript編程

2011-06-23 14:05:32

Qt 事件機(jī)制

2021-09-04 07:29:57

Android

2021-09-10 07:31:54

AndroidAppStartup原理

2021-09-11 07:32:15

Java線程線程池

2021-08-12 16:28:10

AndroidHandleLooper

2021-10-03 15:08:32

Android
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

黄色国产精品视频| 狼狼综合久久久久综合网| 亚洲综合一区二区不卡| 五级黄高潮片90分钟视频| 成人av集中营| 亚洲在线成人精品| 免费一区二区三区| 国产一区二区麻豆| 国产精品久久久久久模特 | 国产精品一区电影| 精品视频久久久久| 欧美日韩一二| 亚洲国产另类久久精品| 色戒在线免费观看| 自拍网站在线观看| 夜夜爽夜夜爽精品视频| 亚洲高清不卡一区| 欧美视频一二区| 精品在线观看视频| 日韩69视频在线观看| 免费在线一区二区三区| 成人在线免费观看网站| 亚洲精品av在线播放| 日韩av自拍偷拍| 二吊插入一穴一区二区| 亚洲一级在线观看| 中文字幕乱码免费| 91大神在线网站| 久久五月婷婷丁香社区| 国产91aaa| 国产精品久久久久毛片| 秋霞av亚洲一区二区三| 人人澡人人澡人人看欧美| 久久久久成人网站| 亚洲国产精品久久久天堂 | 亚洲a v网站| 九九热hot精品视频在线播放| 欧美一区二区播放| 亚洲一二三不卡| 四虎视频在线精品免费网址| 欧洲一区二区av| 可以免费观看av毛片| 国产高清中文字幕在线| 亚洲午夜在线视频| 无码人妻精品一区二区蜜桃百度| 欧美精品videos另类| 国产欧美精品一区| 奇米视频888战线精品播放| 午夜av免费在线观看| 99久久精品99国产精品| 精品国产免费人成电影在线观...| 亚洲爱爱综合网| 大陆成人av片| 国产伦精品一区二区三区高清| www国产一区| 成人爽a毛片一区二区免费| 成人91视频| 粉嫩小泬无遮挡久久久久久| 成人晚上爱看视频| 久久99精品久久久水蜜桃| 四虎精品一区二区三区| 久久一区二区视频| 亚洲精品影院| 操你啦视频在线| 亚洲线精品一区二区三区| 婷婷无套内射影院| 成人片免费看| 欧美亚洲图片小说| 亚洲精品第三页| 1769国产精品视频| 亚洲精品在线观看网站| 亚洲制服丝袜在线播放| 免费视频亚洲| 久久亚洲影音av资源网 | 91网站在线免费观看| 亚洲春色一区二区三区| 91麻豆.com| 亚洲精品中文综合第一页| 久久亚洲天堂| 亚洲成人av电影在线| 99久久久无码国产精品6| 91亚洲精品| 精品久久国产字幕高潮| 免费观看av网站| 天堂美国久久| 久久免费少妇高潮久久精品99| 亚洲日本韩国在线| 久久se这里有精品| 国产精品区一区| 91se在线| 偷窥国产亚洲免费视频| 鲁一鲁一鲁一鲁一av| 哺乳挤奶一区二区三区免费看| 亚洲美女性视频| 亚洲一二三四五六区| 亚洲经典自拍| 国产男女猛烈无遮挡91| 日本高清视频免费观看| 国产精品久久看| 欧美日韩精品在线一区二区 | 在线āv视频| 一本色道久久综合狠狠躁的推荐| 992kp免费看片| 蜜桃一区二区| 久久久久久久爱| 一级片aaaa| 久久久99精品久久| 青青在线视频免费观看| 99九九久久| 亚洲精品国产欧美| 午夜精品福利在线视频| 日韩影院在线观看| 久久草视频在线看| 亚洲区欧洲区| 欧美老人xxxx18| 精品人伦一区二区| 一本不卡影院| www.成人三级视频| 国产精品一区二区三区视频网站| 欧洲亚洲国产日韩| 国产国语性生话播放| 国产精品二区影院| 成人黄色av网站| av女优在线| 一本一道久久a久久精品综合蜜臀| 国产精品一区二区在线免费观看| 天天久久综合| 国产精品一区二区久久久久| 都市激情一区| 色婷婷激情久久| 女人被狂躁c到高潮| 亚洲激情成人| 国产不卡一区二区三区在线观看| 国产在线1区| 6080亚洲精品一区二区| 蜜桃av.com| 激情综合色综合久久综合| 日本一区二区在线| 日本免费一区二区三区四区| 精品视频久久久| 久久久久久91亚洲精品中文字幕| av高清不卡在线| 国精产品一区一区三区视频| 波多野结衣欧美| 国内精品久久久久影院优| 亚洲男人第一天堂| 午夜精品在线视频一区| av免费观看不卡| 亚洲精品欧洲| 久久久精品动漫| 日韩电影网站| 日韩在线激情视频| 国产草草影院ccyycom| 亚洲激情图片小说视频| 国产精品一区二区在线免费观看| 亚洲区一区二| 久久涩涩网站| www.久久.com| 久久亚洲精品视频| 日本高清视频免费看| 精品动漫一区二区| 在线观看国产精品一区| 久久国产尿小便嘘嘘| 91精品国产吴梦梦| 成人三级av在线| 日本成人激情视频| 95在线视频| 日韩丝袜美女视频| 中文字幕国产在线观看| 国产欧美视频在线观看| 黄色一级片免费播放| 一区视频在线看| 日韩精品欧美在线| 国产在线一区不卡| 91av在线影院| 日本综合在线| 精品久久久久99| 久久精品视频2| 亚洲六月丁香色婷婷综合久久 | 嫩草国产精品入口| 国产精品久久久久久久久借妻| 黄网站app在线观看| 亚洲成人久久久| 中文字幕人妻精品一区| 亚洲最大成人综合| 色欲AV无码精品一区二区久久| 国内精品伊人久久久久av影院| 国产曰肥老太婆无遮挡| 欧美日韩国产传媒| 国产成人精品一区二区三区福利| 精品3atv在线视频| 欧美精品18videosex性欧美| 国产系列电影在线播放网址| 日韩一区二区免费视频| 99re国产在线| 亚洲制服丝袜在线| 国产视频三区四区| www.爱久久.com| 日本美女视频一区| 国产模特精品视频久久久久| 国产日韩第一页| 免费成人av| 鬼打鬼之黄金道士1992林正英| 91成人在线| 欧美一区二区三区…… | 一区二区三区精品在线观看| 成人激情五月天| 99久久99久久综合| 韩国三级在线看| 麻豆国产精品777777在线| aa在线免费观看| 欧美日韩hd| 日本成人性视频| 成人亚洲一区二区| 欧美一区少妇| 日韩母乳在线| 国产精品一区二区欧美黑人喷潮水| 久久天天久久| 国产精品久久久久久久久久久久久| 成人在线黄色电影| 欧美巨大黑人极品精男| 黄av在线免费观看| 主播福利视频一区| 成年在线电影| 国产一区二区免费| 精品久久av| 亚洲人成在线一二| 亚洲aaa在线观看| 亚洲国产成人在线视频| 亚洲精品国偷拍自产在线观看蜜桃| 欧美日本国产一区| 在线观看亚洲黄色| 在线精品国精品国产尤物884a| 女人十八岁毛片| 福利视频导航一区| 精品欧美一区二区三区免费观看| 亚洲国产精品久久艾草纯爱| 国产在线拍揄自揄拍| 一区二区三区四区视频精品免费| 久久精品黄色片| 亚洲精品视频一区二区| 久热这里有精品| 亚洲黄色免费网站| 中文字幕手机在线观看| 一区二区三区国产精品| 老女人性淫交视频| 亚洲综合图片区| 久久亚洲成人av| 亚洲地区一二三色| 青青草av在线播放| 一本大道久久a久久综合| 欧美亚洲另类小说| 欧美日韩一级片网站| 一级黄色大片网站| 91麻豆精品国产91久久久| 亚洲精品97久久中文字幕| 亚洲国产精品va在线看黑人| 五月激情丁香婷婷| 在线观看久久av| 老司机在线永久免费观看| 欧美精品做受xxx性少妇| 成人免费高清观看| 欧美一级免费看| 九色成人搞黄网站| 亚洲一区二区日本| 红杏一区二区三区| 欧美婷婷久久| 久久久人成影片免费观看| 免费看欧美一级片| 亚洲欧美日韩精品一区二区| 蜜臀视频一区二区三区| 韩国v欧美v日本v亚洲v| 日本中文字幕精品| 93久久精品日日躁夜夜躁欧美| 欧洲美熟女乱又伦| 一区二区三区色| 亚洲自拍一区在线观看| 欧美一区二区私人影院日本| 少妇荡乳情欲办公室456视频| 亚洲色图综合久久| 成人国产免费电影| 欧美自拍视频在线| 久久99成人| 鲁丝片一区二区三区| 99精品视频精品精品视频| 欧美综合在线播放| 美腿丝袜亚洲三区| 国产麻豆剧传媒精品国产av| 国产精品天美传媒| 日韩 欧美 精品| 欧美日韩电影一区| 人妻精品无码一区二区| 最好看的2019年中文视频| 成全电影大全在线观看| 国产欧美久久一区二区| 欧洲亚洲一区二区三区| 中国一区二区三区| 性8sex亚洲区入口| 秋霞午夜鲁丝一区二区| 日本一区二区动态图| 日本少妇毛茸茸高潮| 91精品中文字幕一区二区三区| 你懂的在线免费观看| 久久全球大尺度高清视频| 成人国产在线| 免费在线一区二区| 海角社区69精品视频| 中文字幕色网站| 欧美国产精品一区二区三区| 日韩在线视频免费播放| 日韩一级免费一区| 在线毛片网站| 国产97色在线|日韩| 美腿丝袜亚洲图片| 毛片av在线播放| 国产一区二区三区观看| 超薄肉色丝袜一二三| 一本到一区二区三区| 天堂网www中文在线| 欧美极品美女电影一区| 久久综合偷偷噜噜噜色| 超碰免费在线公开| 免费观看成人av| 国产美女免费网站| 日本乱人伦一区| 国产中文在线视频| 日本老师69xxx| 九九在线精品| 欧美色图另类小说| 99久久久国产精品| 五月天婷婷网站| 精品999久久久| aa级大片免费在线观看| 国产成人看片| 亚洲激情综合| 97香蕉碰碰人妻国产欧美| 亚洲国产欧美在线| 日本精品一二区| 午夜精品三级视频福利| 日韩欧美影院| av免费在线播放网站| 久久蜜臀精品av| 中文字幕永久在线| 中日韩美女免费视频网站在线观看 | 亚洲AV无码成人片在线观看| 久久精品人人做人人爽| 国产视频一区二| 久久久久久久香蕉| av日韩在线网站| 日韩精品一区不卡| 这里精品视频免费| 99久久久国产| 奇米777四色影视在线看| 成人av片在线观看| 中文字幕激情小说| 中文字幕精品一区二区精品| 香蕉成人在线| 波多野结衣与黑人| 不卡电影一区二区三区| 国产精品视频一区在线观看| 一个色综合导航| 日本精品一区二区三区在线观看视频| 亚洲乱码日产精品bd在线观看| 99麻豆久久久国产精品免费| 天堂а√在线中文在线新版| 深夜成人在线观看| 天堂va在线高清一区| 国产精品一区二区免费在线观看| 久久久国产一区二区三区四区小说 | www.欧美日本韩国| 国产日韩精品久久| 青青草国产成人99久久| 可以直接看的黄色网址| 亚洲国产精品小视频| 久久精品黄色| 菠萝蜜视频在线观看入口| 91免费精品国自产拍在线不卡| 中文字幕精品一区二区精| 欧美高清电影在线看| 婷婷成人在线| 91丝袜超薄交口足| 欧美日韩亚洲激情| 成人国产免费电影| 欧美日韩大片一区二区三区| 久久99国产乱子伦精品免费| 欧美日韩综合在线观看| 北条麻妃久久精品| 日本一区福利在线| 四季av一区二区三区| 精品福利在线视频| 求av网址在线观看| 久久综合狠狠综合久久综青草 | 国产xxxxxxxxx| 欧美顶级少妇做爰| 性xxxxfreexxxxx欧美丶| 国产av第一区| 久久久不卡网国产精品一区| 亚洲成人中文字幕在线| 国产精品日韩在线| 亚洲少妇在线|