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

“入職接手舊項目,所有網絡請求數據通過 EventBus 分發,嚇得我想離職...”

企業動態
EventBus 是一個基于觀察者模式的事件訂閱/發布框架。利用 EventBus 可以在不同模塊之間,實現低耦合的消息通信。

 [[276585]]

一. 序

雖然現在互聯網行業的就業形式「相當嚴峻」,張小胖還是成功跳槽漲薪。

入職第一天 Leader 說,“你剛來,這周先熟悉熟悉咱們的項目吧”。

張小胖熟練的用 Git pull 代碼到本地,環境變量一通配置,終于把項目跑了起來,看著項目里的網絡請求數據,居然全是靠 EventBus 分發,陷入了深深的沉思…

在子線程請求數據,再通過 EventBus 將數據分發到主線程,這是什么騷操作?這難道不會有問題嗎?

雖然 EventBus 可以做到多模塊之間低耦合的事件通信,可完全利用 EventBus 去做線程切換,解耦是解耦了,但靠譜的項目根本不會這么干。

不過既然聊到了 EventBus 的線程切換,那今天就深入聊聊當 EventBus 事件分發,遇上線程切換的時候,是如何處理的。以及使用的時候有什么需要注意的,大量的依賴 EventBus 的線程切換,會不會有效率問題。

二. EventBus 的線程切換

2.1 EventBus 切換線程

EventBus 是一個基于觀察者模式的事件訂閱/發布框架。利用 EventBus 可以在不同模塊之間,實現低耦合的消息通信。

 

EventBus 誕生以來這么多年,在很多生產項目中都可以看到它的身影。而從更新日志可以看到,除了體積小,它還很穩定,這兩年就沒更新過,最后一次更新也只是因為支持所有的 JVM,讓其使用范圍不僅僅局限在 Android 上。

可謂是非常的穩定,穩定到讓人有一種感覺,要是你使用 EventBus 出現了什么問題,那一定是你使用的方式不對。

EventBus 的使用方式,對于 Android 老司機來說,必然是不陌生的,相關資料太多,這里就不再贅述了。

在 Android 下,線程的切換是一個很常用而且很必須的操作,EventBus 除了可以訂閱和發送消息之外,它還可以指定接受消息處理消息的線程。

也就是說,無論你 post() 消息時處在什么線程中,EventBus 都可以將消息分發到你指定的線程上去,聽上去就感覺非常的方便。

不過無論怎么切換,無外乎幾種情況:

  • UI 線程切子線程。
  • 子線程切 UI 線程。
  • 子線程切其他子線程。

在我們使用 EventBus 注冊消息的時候,可以通過 @Subscribe 注解來完成注冊事件, @Subscribe 中可以通過參數 threadMode 來指定使用那個線程來接收消息。

  1. @Subscribe(threadMode = ThreadMode.MAIN) 
  2. fun onEventTest(event:TestEvent){ 
  3.   // 處理事件 

threadMode 是一個 enum,有多種模式可供選擇:

  1. POSTING,默認值,那個線程發就是那個線程收。
  2. MAIN,切換至主線程接收事件。
  3. MAIN_ORDERED,v3.1.1 中新增的屬性,也是切換至主線程接收事件,但是和 MAIN 有些許區別,后面詳細講。
  4. BACKGROUND,確保在子線程中接收事件。細節就是,如果是主線程發送的消息,會切換到子線程接收,而如果事件本身就是由子線程發出,會直接使用發送事件消息的線程處理消息。
  5. ASYNC,確保在子線程中接收事件,但是和 BACKGROUND 的區別在于,它不會區分發送線程是否是子線程,而是每次都在不同的線程中接收事件。
  6. EventBus 的線程切換,主要涉及的方法就是 EventBus 的 postToSubscription()方法。
  1. private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) { 
  2.   switch (subscription.subscriberMethod.threadMode) { 
  3.     case POSTING: 
  4.       invokeSubscriber(subscription, event); 
  5.       break; 
  6.     case MAIN: 
  7.       if (isMainThread) { 
  8.         invokeSubscriber(subscription, event); 
  9.       } else { 
  10.         mainThreadPoster.enqueue(subscription, event); 
  11.       } 
  12.       break; 
  13.     case MAIN_ORDERED: 
  14.       if (mainThreadPoster != null) { 
  15.         mainThreadPoster.enqueue(subscription, event); 
  16.       } else { 
  17.         // temporary: technically not correct as poster not decoupled from subscriber 
  18.         invokeSubscriber(subscription, event); 
  19.       } 
  20.       break; 
  21.     case BACKGROUND: 
  22.       if (isMainThread) { 
  23.         backgroundPoster.enqueue(subscription, event); 
  24.       } else { 
  25.         invokeSubscriber(subscription, event); 
  26.       } 
  27.       break; 
  28.     case ASYNC: 
  29.       asyncPoster.enqueue(subscription, event); 
  30.       break; 
  31.     default
  32.       throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode); 
  33.   } 

可以看到,在 postToSubscription() 方法中,對我們配置的 threadMode 值進行了處理。

這段代碼邏輯非常的簡單,接下來我們看看它們執行的細節。

2.2 切換至主線程接收事件

想在主線程接收消息,需要配置 threadMode 為 MAIN。

  1. case MAIN: 
  2.   if (isMainThread) { 
  3.     invokeSubscriber(subscription, event); 
  4.   } else { 
  5.     mainThreadPoster.enqueue(subscription, event); 
  6.   } 

這一段的邏輯很清晰,判斷是主線程就直接處理事件,如果是非主線程,就是用 mainThreadPoster 處理事件。

追蹤 mainThreadPoster 的代碼,具體的邏輯代碼都在 HandlerPoster 類中,它實現了 Poster 接口,這就是一個普通的 Handler,只是它的 Looper 使用的是主線程的 「Main Looper」,可以將消息分發到主線程中。

為了提高效率,EventBus 在這里還做了一些小優化,值得我們借鑒學習。

 

為了避免頻繁的向主線程 sendMessage(),EventBus 的做法是在一個消息里盡可能多的處理更多的消息事件,所以使用了 while 循環,持續從消息隊列 queue 中獲取消息。

同時為了避免長期占有主線程,間隔 10ms (maxMillisInsideHandleMessage = 10ms)會重新發送 sendMessage(),用于讓出主線程的執行權,避免造成 UI 卡頓和 ANR。

MAIN 可以確保事件的接收,在主線程中,需要注意的是,如果事件就是在主線程中發送的,則使用 MAIN 會直接執行。為了讓開發和可配置的程度更高,在 EventBus v3.1.1 新增了 MAIN_ORDERED,它不會區分當前線程,而是通通使用mainThreadPoster 來處理,也就是必然會走一遍 Handler 的消息分發。

當事件需要在主線程中處理的時候,要求不能執行耗時操作,這沒什么好說的,另外對于 MAIN 或者 MAIN_ORDERED 的選擇,就看具體的業務要求了。

2.3 切換至子線程執行

想要讓消息在子線程中處理,可以配置 threadMode 為 BACKGROUND 或者AYSNC,他們都可以實現,但是也有一些區別。

先來看看 BACKGROUND,通過 postToSubscription() 中的邏輯可以看到,BACKGROUND會區分當前發生事件的線程,是否是主線程,非主線程則直接分發事件,如果是主線程,則 backgroundPoster 來分發事件。

  1. case BACKGROUND: 
  2.     if (isMainThread) { 
  3.         backgroundPoster.enqueue(subscription, event); 
  4.     } else { 
  5.         invokeSubscriber(subscription, event); 
  6.     } 
  7. break; 

BackgroundPoster 也實現了 Poster 接口,其中也維護了一個用鏈表實現的消息隊列 PendingPostQueue,

在一些編碼規范里就提到,不要直接創建線程,而是需要使用線程池。EventBus 也遵循這個規范,在 BackgroundPoster 中,就使用了 EventBus 的executorService 線程池對象去執行。

為了提高效率,EventBus 在處理 BackgroundPoster 時,也有一些小技巧值得我們學習。

 

可以看到,在 BackgroundPoster 中,處理主線程拋出的事件時,同一時刻只會存在一個線程,去循環從隊列中,獲取事件處理事件。

通過 synchronized 同步鎖來保證隊列數據的線程安全,同時利用 volatile 標識的 executorRunning 來保證不同線程下看到的執行狀態是可見的。

既然 BACKGROUND 在處理任務的時候,只會使用一個線程,但是 EventBus 卻用到了線程池,看似有點浪費。但是再繼續了解 ASYNC 的實現,才知道怎么樣是對線程池的充分利用。

和前面介紹的 threadMode 一樣,大多數都對應了一個 Poster,而 ASYNC 對應的 Poster 是 AsyncPoster,其中并沒有做任何特殊的處理,所有的事件,都是無腦的拋給 EventBus 的 executorService 這個線程池去處理,這也就保證了,無論如何發生事件的線程,和接收事件的線程,必然是不同的,也保證了一定會在子線程中處理事件。

  1. public void enqueue(Subscription subscription, Object event) { 
  2.     PendingPost pendingPost = PendingPost.obtainPendingPost(subscription, event); 
  3.     queue.enqueue(pendingPost); 
  4.     eventBus.getExecutorService().execute(this); 

到這里應該就理解了 BACKGROUND 和 ASYNC ,雖然都可以保證在子線程中接收處理事件,但是內部實現是不同的。

BACKGROUND 同一時間,只會利用一個子線程,來循環從事件隊列中獲取事件并進行處理,也就是前面的事件的執行效率,會影響后續事件的執行。例如你分發了一個事件,使用的是 BACKGROUND 但是隊列前面還有一個耗時操作,那你分發的這個事件,也必須等待隊列前面的事件都處理完成才可以繼續執行。所以如果你追求執行的效率,立刻馬上就要執行的事件,可以使用 ASYNC。

那是不是都用 ASYNC 就好了?當然這種一攬子的決定都不會好,具體問題具體分析,ASYNC 也有它自己的問題。

ASYNC 會無腦的向線程池 executorService 發送任務,而這個線程池,如果你不配置的話,默認情況下使用的是 Executors 的 newCachedThreadPool() 創建的。

這里我又要說到編碼規范了,不推薦使用 Executors 直接創建線程,之所以這樣,其中一個原因在于線程池對任務的拒絕策略。newCachedThreadPool 則會創建一個無界隊列,來存放線程池暫時無法處理的任務,說到無界隊列,拍腦袋就能想到,當任務(事件)過多時,會出現的 OOM。

這也確實是 EventBus 在使用 ASYNC 時,真實存在的問題。

 

但是其實這里讓開發者自己去配置,也很難配置一個合理的線程池的拒絕策略,拒絕時必然會放棄一些任務,也就是會放棄掉一些事件,任何放棄策略都是不合適的,這在 EventBus 的使用中,表現出來就是出現邏輯錯誤,該收到的事件,收不到了。所以你看,這里無界隊列不合適,但是不用它呢也不合適,唯一的辦法就是盡量少的使用 ASYNC,只在必要且合理的情況下,才去使用它。

三. 小結時刻

到這里基本上 EventBus 在分發事件時的線程切換,就講清除了,很多資料里其實都寫了他們可以切換線程,但是對于一些使用的細節,描述的并不清楚,正好借此文,把 EventBus 的線程切換的直接講清除。

EventBus 也是簡歷上比較常見的高頻詞,我在面試時,也經常會問面試者,關于它是如何做到線程切換的問題。但是正因為它簡單易用,其實很多時候我們都忽略了它的實現細節。

今天就到這里,小結一下:

1. EventBus 可以通過 threadMode 來配置接收事件的線程。

2. MAIN 和 MAIN_ORDERED 都會在主線程接收事件,區別在于是否區分,發生事件的線程是否是主線程。

3. BACKGROUND 確保在子線程中接收線程,它會通過線程池,使用一個線程循環處理所有的事件。所以事件的執行時機,會受到事件隊列前面的事件處理效率的影響。

4. ASYNC 確保在子線程中接收事件,區別于 BACKGROUND,ASYNC 會每次向線程池中發送任務,通過線程池的調度去執行。但是因為線程池采用的是無界隊列,會導致 ASYNC 待處理的事件太多時,會導致 OOM。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】 

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-01-15 07:55:19

Swift蘋果離職

2021-04-12 05:55:29

緩存數據Axios

2023-11-20 21:56:57

入職微軟

2021-09-26 10:15:44

離職程序員復盤

2018-08-09 10:14:25

程序猿競業限制補償金

2025-02-06 16:33:04

2018-07-16 16:39:00

數據

2021-03-27 22:21:48

HTTPPython數據

2025-09-17 16:49:42

2023-05-04 10:05:30

離職谷歌

2020-10-20 09:51:51

Vue 3 的組合

2020-10-20 09:30:13

Vue 3 API 數據

2020-11-03 07:48:47

當AI入職FBI

2022-05-25 11:17:33

日志系統維護

2021-05-17 08:11:44

MySQL數據庫索引

2018-01-15 15:00:06

工程師項目設計師

2024-02-06 14:09:00

微服務項目集成

2020-11-13 11:01:33

工具人互聯網技術

2020-02-22 14:49:30

畢業入職半年感受

2021-09-20 11:09:13

項目語言語法
點贊
收藏

51CTO技術棧公眾號

国产精品日本| 亚洲男女网站| 久久中文字幕电影| 欧洲亚洲妇女av| 久久久久久国产精品无码| 成人免费影院| 国产精品久久久久天堂| 亚洲自拍av在线| 日韩免费不卡视频| 精品视频日韩| 91精品国产一区二区三区| 国产精品久久久久久久久电影网| 人妻精品无码一区二区| 亚洲精品乱码| 一区二区三区四区在线观看视频| 午夜xxxxx| 免费h视频在线观看| 国产精品午夜在线观看| 国产精品草莓在线免费观看| 永久免费未视频| 神马香蕉久久| 91精品国产福利| av观看免费在线| 国产精品二线| 成人午夜又粗又硬又大| 国产精品美女网站| 精品一级少妇久久久久久久| 一区二区三区韩国免费中文网站| 在线成人高清不卡| 国产二区视频在线播放| 国产黄a三级三级三级av在线看 | 日本中文字幕在线观看视频| 国产日产一区 | 777精品视频| 极品蜜桃臀肥臀-x88av| 中文久久电影小说| 欧美撒尿777hd撒尿| 僵尸世界大战2 在线播放| 久久综合之合合综合久久| 91在线小视频| 成人激情视频网| 日韩精选在线观看| 亚洲在线播放| 欧美老少做受xxxx高潮| 91精品国自产在线| 精品视频高潮| 日韩视频不卡中文| 免费av不卡在线| 欧美日韩免费看片| 精品久久久久久中文字幕一区奶水| 午夜精品福利一区二区| 西西人体44www大胆无码| 久久国产综合精品| 国产精品久久久久久中文字| 欧美日韩乱国产| 日韩视频在线一区二区三区| 久久久精品视频在线观看| 2019男人天堂| 国内成人精品| 亚洲网站在线播放| 波多野结衣办公室33分钟| 久草在线综合| 亚洲国产精品系列| 欧美日韩一区二区三区四区五区六区| 亚洲精品乱码日韩| 欧美日韩精品久久久| 亚洲五月天综合| 日韩在线免费| 欧美亚洲一区二区三区四区| 欧美三级午夜理伦三级| 97成人资源| 欧美日韩国产区| 欧美韩国日本在线| 美女网站在线看| 日韩欧美亚洲范冰冰与中字| 日日橹狠狠爱欧美超碰| a√中文在线观看| 午夜电影网一区| 无码人妻丰满熟妇区96| 亚洲校园激情春色| 在线一区二区三区| 一区二区三区入口| 日韩精品一区二区三区av| 欧美伊人久久大香线蕉综合69| 成人中文字幕在线播放| 超碰aⅴ人人做人人爽欧美| 精品久久久久久久久久国产| 免费黄色日本网站| 四虎4545www精品视频| 欧美在线啊v一区| 五月花丁香婷婷| jizz久久精品永久免费| 日韩电视剧免费观看网站| 亚洲第九十七页| 欧美军人男男激情gay| 自拍偷拍亚洲在线| 综合五月激情网| 一区二区国产精品| 国产成人在线播放| 国产伦精品一区二区三区四区| 国产又黄又大久久| 国产高清自拍99| 久久综合九色综合久| 中文字幕av一区二区三区免费看| 综合操久久久| av漫画网站在线观看| 欧美性猛交xxxx免费看漫画| 国产成人黄色网址| 中文久久电影小说| 国产亚洲精品久久久久久777 | 加勒比久久高清| 亚洲欧美精品一区二区| 青花影视在线观看免费高清| 一区免费在线| 国产精品三级网站| 亚洲男人天堂久久| 久久精品人人做人人爽97| 99精品视频网站| 国内精彩免费自拍视频在线观看网址| 欧美色老头old∨ideo| 稀缺呦国内精品呦| 久久精品高清| 26uuu亚洲国产精品| 亚洲综合网av| 26uuu亚洲综合色欧美| 99热都是精品| 极品美鲍一区| 欧美一区二区成人6969| 国产免费看av| 伊人久久成人| 亚洲bt天天射| 成人高清免费观看mv| 亚洲一区中文在线| 天堂网在线免费观看| 三级小说欧洲区亚洲区| 久久久999精品视频| 无码一区二区三区| bt7086福利一区国产| 国产四区在线观看| 51一区二区三区| 亚洲精品一区二区在线| 97精品在线播放| 日韩制服丝袜av| 精品久久久久久一区二区里番| а√天堂8资源在线官网| 在线视频欧美区| 香蕉视频黄色在线观看| 欧美午夜影院| 国产欧美日韩中文| 第一页在线观看| 色一情一伦一子一伦一区| 国产色视频在线播放| 精品不卡一区| 7777免费精品视频| 国产高清免费观看| 国产欧美一区二区三区网站| 国产妇女馒头高清泬20p多| 麻豆国产精品| 欧美成人中文字幕在线| 国产又大又黄又爽| 成人免费在线视频观看| 久久国产精品国产精品| 九九久久婷婷| 国产成人在线精品| 国产视频网站在线| 欧日韩精品视频| 日本少妇高潮喷水xxxxxxx| 校园激情久久| 欧洲高清一区二区| 日本免费一区二区三区四区| 亚洲男人天堂九九视频| 国产无遮挡呻吟娇喘视频| 99国产精品久久久久久久久久| 国产96在线 | 亚洲| 国产人妖ts一区二区| 国产69精品99久久久久久宅男| 亚洲AV无码一区二区三区少妇| 一区二区在线看| 国产一线在线观看| 免费日韩视频| 日韩视频专区| 2020国产精品小视频| 精品久久久999| 精品久久久久中文慕人妻| 亚洲无线码一区二区三区| 日本一级片在线播放| 久久天堂精品| 亚洲一区二区在线免费观看| 97久久精品一区二区三区的观看方式| 中文字幕精品在线| 国产口爆吞精一区二区| 五月天激情小说综合| 这里只有精品在线观看视频| 裸体一区二区| 一级做a爰片久久| 亚洲成人精品综合在线| 欧美激情一区二区三区久久久| 人人妻人人玩人人澡人人爽| 欧美性精品220| 国产中文字幕久久| 不卡欧美aaaaa| 国产aaaaa毛片| 欧美在线看片| 欧美一区二视频在线免费观看| 欧美aaaaaaaa| 午夜精品久久久久久久久久久久 | 成人黄色片视频| 99九九热只有国产精品| 91免费精品视频| 538在线精品| 日韩中文字幕欧美| 日本黄色三级视频| 在线观看91av| 国产一级片免费在线观看| 亚洲精品写真福利| 黄免费在线观看| 国产成人av一区二区三区在线| 日本精品一区二区三区四区| 亚洲激情中文| 亚洲成人第一| 欧美激情极品| 91文字幕巨乱亚洲香蕉| 桃子视频成人app| 欧美激情视频网址| 98在线视频| 亚洲黄色在线看| 国产www免费观看| 在线免费不卡电影| 欧美激情亚洲综合| 伊人婷婷欧美激情| 国产精品18在线| 国产日韩欧美一区二区三区综合| 肉丝美足丝袜一区二区三区四| 免费亚洲电影在线| 丰满少妇在线观看| 久久这里有精品15一区二区三区| 国产原创popny丨九色| 在线看片日韩| 国产不卡一区二区视频| 亚洲精品1区| 国产91xxx| 国产精品免费看| 欧美精品色婷婷五月综合| 99热这里只有精品8| 精品国产一区三区| 亚洲欧美日韩国产一区二区| 成人在线免费观看av| 久久国产66| 亚洲国产精品毛片av不卡在线| 久热精品视频| 国产精品自拍视频在线| 精品一区二区三区视频 | 成人国产电影网| 日本50路肥熟bbw| 91免费观看国产| 无码一区二区三区在线| 国产精品三级视频| 日本 欧美 国产| 亚洲精品免费看| 日产精品久久久久| 色婷婷综合久久久中文一区二区| 天天干天天操天天操| 欧美性感一区二区三区| 国产精品无码久久av| 日韩精品在线看片z| 天堂在线视频免费观看| 亚洲欧洲在线观看| 男人天堂久久久| 九九久久久久99精品| 僵尸再翻生在线观看| 国产精品久久久久久久app | 日韩一二三区不卡| 黄色一级a毛片| 影音先锋日韩有码| 欧美女同一区| 国产aaa精品| 国产精品777777在线播放| 国产乱码精品一区二区三区卡| 免费毛片在线不卡| 男同互操gay射视频在线看| 亚洲国内精品| 中文字幕在线观看日| 成人h动漫精品| 国产成人免费观看网站| 一区二区激情视频| 久久精品五月天| 日韩免费看网站| 黄色影院在线播放| 色综合视频一区中文字幕| 成人免费看视频网站| 亚洲xxxxx电影| 九九久久精品| 国产自产在线视频| 久久www免费人成看片高清| 四虎精品一区二区| 国产精品毛片久久久久久| 精品一区二区三区四| 欧美日韩在线三级| 天堂在线中文字幕| 欧美成人免费小视频| 亚洲成人va| 精品亚洲第一| 欧美a级片网站| 一区二区xxx| www国产成人| 久久综合亚洲色hezyo国产| 欧美日韩一区精品| 天堂av在线7| 国内精品久久久久久久久| 亚洲国产天堂| 亚洲精品国产系列| 欧美一级二区| 制服丝袜第一页在线观看| 亚洲欧洲日韩在线| 无码人妻精品一区二区三区9厂 | 91久久精品一区二区二区| 亚洲精品字幕在线观看| 久久亚洲精品一区二区| 99久久精品一区二区成人| 精品一区二区视频| 亚洲视频日本| 成年人看片网站| 亚洲日本va在线观看| 中文字幕欧美色图| 国产亚洲精品美女久久久| 欧美天堂视频| 精品午夜一区二区| 国产亚洲成人一区| 国产性猛交96| 亚洲国产aⅴ成人精品无吗| a天堂在线观看视频| xxxxx成人.com| 精品176极品一区| 亚洲精品乱码久久久久久蜜桃91| 水野朝阳av一区二区三区| av网站有哪些| 欧美日韩久久久久| 欧洲毛片在线| 欧美一区二区视频97| 日韩欧美四区| 凹凸国产熟女精品视频| 久久综合久久综合九色| 国产免费观看av| 精品亚洲aⅴ在线观看| 唐人社导航福利精品| 欧美一区视久久| 日本成人超碰在线观看| 国产又粗又猛又爽又黄的视频小说| 欧美网站大全在线观看| jizz视频在线观看| 国产日韩中文字幕在线| 国产精品久久久久久久久久10秀| 中国黄色片一级| 亚洲欧美日韩久久| 亚洲大尺度网站| 久久久亚洲成人| 综合伊思人在钱三区| 88av.com| 国产精品国产a| 性一交一乱一伧老太| 91国语精品自产拍在线观看性色| 中日韩免视频上线全都免费| 精品久久久久久久无码| 中文字幕一区在线| 国产成人精品亚洲精品色欲| 久久久久久久久亚洲| 青青草原在线亚洲| 午夜国产一区二区三区| 亚洲美女屁股眼交3| 欧日韩在线视频| 国产精品久久久久久av| 婷婷色综合网| 影音先锋黄色资源| 欧美伊人久久大香线蕉综合69 | 综合婷婷亚洲小说| 好吊色视频一区二区| 国产不卡精品视男人的天堂| 色欧美自拍视频| 久久久久久久无码| 欧美亚洲综合在线| а√天堂中文在线资源8| 五月婷婷一区| 成av人片一区二区| 在线观看毛片视频| 高清一区二区三区日本久| 欧美色图在线播放| 无码人妻精品一区二区三| 色88888久久久久久影院按摩| 国产精品实拍| 欧美xxxx黑人又粗又长密月| 国内精品视频一区二区三区八戒| 日韩精品一区二区在线播放 | 免费中文字幕在线| 亚洲天堂网站在线观看视频| 亚洲国产高清在线观看| 午夜欧美福利视频| 亚洲成人高清在线| 黄黄的网站在线观看| 欧美日韩免费高清| 成人av片在线观看|