久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Android View.Post 的原理及缺陷

瀏覽:3日期:2022-09-20 14:20:57

很多開發者都了解這么一個知識點:在 Activity 的 onCreate 方法里我們無法直接獲取到 View 的寬高信息,但通過 View.post(Runnable)這種方式就可以,那背后的具體原因你是否有了解過呢?

讀者可以嘗試以下操作??梢园l現,除了通過 View.post(Runnable)這種方式可以獲得 View 的真實寬高外,其它方式取得的值都是 0

/** * 作者:leavesC * 時間:2020/03/14 11:05 * 描述: * GitHub:https://github.com/leavesC */class MainActivity : AppCompatActivity() { private val view by lazy { findViewById<View>(R.id.view) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) getWidthHeight('onCreate') view.post { getWidthHeight('view.Post') } Handler().post { getWidthHeight('handler') } } override fun onResume() { super.onResume() getWidthHeight('onResume') } private fun getWidthHeight(tag: String) { Log.e(tag, 'width: ' + view.width) Log.e(tag, 'height: ' + view.height) }}

github.leavesc.view E/onCreate: width: 0github.leavesc.view E/onCreate: height: 0github.leavesc.view E/onResume: width: 0github.leavesc.view E/onResume: height: 0github.leavesc.view E/handler: width: 0github.leavesc.view E/handler: height: 0github.leavesc.view E/view.Post: width: 263github.leavesc.view E/view.Post: height: 263

從這就可以引申出幾個疑問:

View.post(Runnable) 為什么可以得到 View 的真實寬高 Handler.post(Runnable)和View.post(Runnable)有什么區別 在 onCreate、onResume 函數中為什么無法直接得到 View 的真實寬高 View.post(Runnable) 中的 Runnable 是由誰來執行的,可以保證一定會被執行嗎

后邊就來一一解答這幾個疑問,本文基于 Android API 30 進行分析

一、View.post(Runnable)

看下 View.post(Runnable) 的方法簽名,可以看出 Runnable 的處理邏輯分為兩種:

如果 mAttachInfo 不為 null,則將 Runnable 交由mAttachInfo內部的 Handler 進行處理 如果 mAttachInfo 為 null,則將 Runnable 交由 HandlerActionQueue 進行處理

public boolean post(Runnable action) { final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { return attachInfo.mHandler.post(action); } // Postpone the runnable until we know on which thread it needs to run. // Assume that the runnable will be successfully placed after attach. getRunQueue().post(action); return true; } private HandlerActionQueue getRunQueue() { if (mRunQueue == null) { mRunQueue = new HandlerActionQueue(); } return mRunQueue; }1、AttachInfo

先來看View.post(Runnable)的第一種處理邏輯

AttachInfo 是 View 內部的一個靜態類,其內部持有一個 Handler 對象,從注釋可知它是由 ViewRootImpl 提供的

final static class AttachInfo { /** * A Handler supplied by a view’s {@link android.view.ViewRootImpl}. This * handler can be used to pump events in the UI events queue. */ @UnsupportedAppUsage final Handler mHandler; AttachInfo(IWindowSession session, IWindow window, Display display, ViewRootImpl viewRootImpl, Handler handler, Callbacks effectPlayer, Context context) { ··· mHandler = handler; ··· } ···}

查找 mAttachInfo 的賦值時機可以追蹤到 View 的 dispatchAttachedToWindow 方法,該方法被調用就意味著 View 已經 Attach 到 Window 上了

@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) void dispatchAttachedToWindow(AttachInfo info, int visibility) { mAttachInfo = info; ··· }

再查找dispatchAttachedToWindow 方法的調用時機,可以跟蹤到 ViewRootImpl 類。ViewRootImpl 內就包含一個 Handler 對象 mHandler,并在構造函數中以 mHandler 作為構造參數之一來初始化 mAttachInfo。ViewRootImpl 的performTraversals()方法就會調用 DecorView 的 dispatchAttachedToWindow 方法并傳入 mAttachInfo,從而層層調用整個視圖樹中所有 View 的 dispatchAttachedToWindow 方法,使得所有 childView 都能獲取到 mAttachInfo 對象

final ViewRootHandler mHandler = new ViewRootHandler(); public ViewRootImpl(Context context, Display display, IWindowSession session, boolean useSfChoreographer) { ··· mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this, context); ··· } private void performTraversals() { ··· if (mFirst) { ··· host.dispatchAttachedToWindow(mAttachInfo, 0); ··· } ··· performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); performLayout(lp, mWidth, mHeight); performDraw(); ··· }

此外,performTraversals()方法也負責啟動整個視圖樹的 Measure、Layout、Draw 流程,只有當 performLayout 被調用后 View 才能確定自己的寬高信息。而 performTraversals()本身也是交由 ViewRootHandler 來調用的,即整個視圖樹的繪制任務也是先插入到 MessageQueue 中,后續再由主線程取出任務進行執行。由于插入到 MessageQueue 中的消息是交由主線程來順序執行的,所以 attachInfo.mHandler.post(action)就保證了 action 一定是在 performTraversals 執行完畢后才會被調用,因此我們就可以在 Runnable 中獲取到 View 的真實寬高了

2、HandlerActionQueue

再來看View.post(Runnable)的第二種處理邏輯

HandlerActionQueue 可以看做是一個專門用于存儲 Runnable 的任務隊列,mActions 就存儲了所有要執行的 Runnable 和相應的延時時間。兩個post方法就用于將要執行的 Runnable 對象保存到 mActions中,executeActions就負責將mActions中的所有任務提交給 Handler 執行

public class HandlerActionQueue { private HandlerAction[] mActions; private int mCount; public void post(Runnable action) { postDelayed(action, 0); } public void postDelayed(Runnable action, long delayMillis) { final HandlerAction handlerAction = new HandlerAction(action, delayMillis); synchronized (this) { if (mActions == null) { mActions = new HandlerAction[4]; } mActions = GrowingArrayUtils.append(mActions, mCount, handlerAction); mCount++; } } public void executeActions(Handler handler) { synchronized (this) { final HandlerAction[] actions = mActions; for (int i = 0, count = mCount; i < count; i++) { final HandlerAction handlerAction = actions[i]; handler.postDelayed(handlerAction.action, handlerAction.delay); } mActions = null; mCount = 0; } } private static class HandlerAction { final Runnable action; final long delay; public HandlerAction(Runnable action, long delay) { this.action = action; this.delay = delay; } public boolean matches(Runnable otherAction) { return otherAction == null && action == null || action != null && action.equals(otherAction); } } ··· }

所以說,getRunQueue().post(action)只是將我們提交的 Runnable 對象保存到了 mActions 中,還需要外部主動調用 executeActions方法來執行任務

而這個主動執行任務的操作也是由 View 的 dispatchAttachedToWindow來完成的,從而使得 mActions 中的所有任務都會被插入到 mHandler 的 MessageQueue 中,等到主線程執行完 performTraversals() 方法后就會來執行 mActions,所以此時我們依然可以獲取到 View 的真實寬高

@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) void dispatchAttachedToWindow(AttachInfo info, int visibility) { mAttachInfo = info; ··· // Transfer all pending runnables. if (mRunQueue != null) { mRunQueue.executeActions(info.mHandler); mRunQueue = null; } ··· }二、Handler.post(Runnable)

Handler.post(Runnable)和View.post(Runnable)有什么區別呢?

從上面的源碼分析就可以知道,View.post(Runnable)之所以可以獲取到 View 的真實寬高,主要就是因為確保了獲取 View 寬高的操作一定是在 View 繪制完畢之后才被執行,而 Handler.post(Runnable)之所以不行,就是其無法保證這一點

雖然這兩種post(Runnable)的操作都是往同個 MessageQueue 插入任務,且最終都是交由主線程來執行。但繪制視圖樹的任務是在onResume被回調后才被提交的,所以我們在onCreate中用 Handler 提交的任務就會早于繪制視圖樹的任務被執行,因此也就無法獲取到 View 的真實寬高了

三、onCreate & onResume

在 onCreate、onResume 函數中為什么無法也直接得到 View 的真實寬高呢?

從結果反推原因,這說明當 onCreate、onResume被回調時 ViewRootImpl 的 performTraversals()方法還未執行,那么performTraversals()方法的具體執行時機是什么時候呢?

這可以從 ActivityThread -> WindowManagerImpl -> WindowManagerGlobal -> ViewRootImpl 這條調用鏈上找到答案

首先,ActivityThread 的 handleResumeActivity 方法就負責來回調 Activity 的 onResume 方法,且如果當前 Activity 是第一次啟動,則會向 ViewManager(wm)添加 DecorView

@Override public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { ··· //Activity 的 onResume 方法 final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason); ··· if (r.window == null && !a.mFinished && willBeVisible) { ··· ViewManager wm = a.getWindowManager(); if (a.mVisibleFromClient) { if (!a.mWindowAdded) { a.mWindowAdded = true; //重點 wm.addView(decor, l); } else { a.onWindowAttributesChanged(l); } } } else if (!willBeVisible) { if (localLOGV) Slog.v(TAG, 'Launch ' + r + ' mStartedActivity set'); r.hideForNow = true; }··· }

此處的 ViewManager 的具體實現類即 WindowManagerImpl,WindowManagerImpl 會將操作轉交給 WindowManagerGlobal

@UnsupportedAppUsage private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();@Override public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { applyDefaultToken(params); mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow, mContext.getUserId()); }

WindowManagerGlobal 就會完成 ViewRootImpl 的初始化并且調用其 setView 方法,該方法內部就會再去調用 performTraversals 方法啟動視圖樹的繪制流程

public void addView(View view, ViewGroup.LayoutParams params, Display display, Window parentWindow, int userId) { ··· ViewRootImpl root; View panelParentView = null; synchronized (mLock) { ··· root = new ViewRootImpl(view.getContext(), display); view.setLayoutParams(wparams); mViews.add(view); mRoots.add(root); mParams.add(wparams); // do this last because it fires off messages to start doing things try { root.setView(view, wparams, panelParentView, userId); } catch (RuntimeException e) { // BadTokenException or InvalidDisplayException, clean up. if (index >= 0) { removeViewLocked(index, true); } throw e; } } }

所以說, performTraversals 方法的調用時機是在 onResume 方法之后,所以我們在 onCreate和onResume 函數中都無法獲取到 View 的實際寬高。當然,當 Activity 在單次生命周期過程中第二次調用onResume 方法時自然就可以獲取到 View 的寬高屬性

四、View.post(Runnable) 的兼容性

從以上分析可以得出一個結論:由于 View.post(Runnable)最終都是往和主線程關聯的 MessageQueue 中插入任務且最終由主線程來順序執行,所以即使我們是在子線程中調用View.post(Runnable),最終也可以得到 View 正確的寬高值

但該結論也只在 API 24 及之后的版本上才成立,View.post(Runnable) 方法也存在著一個版本兼容性問題,在 API 23 及之前的版本上有著不同的實現方式

//Android API 24 及之后的版本public boolean post(Runnable action) { final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { return attachInfo.mHandler.post(action); } // Postpone the runnable until we know on which thread it needs to run. // Assume that the runnable will be successfully placed after attach. getRunQueue().post(action); return true; }//Android API 23 及之前的版本public boolean post(Runnable action) { final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { return attachInfo.mHandler.post(action); } // Assume that post will succeed later ViewRootImpl.getRunQueue().post(action); return true; }

在 Android API 23 及之前的版本上,當 attachInfo 為 null 時,會將 Runnable 保存到 ViewRootImpl 內部的一個靜態成員變量 sRunQueues 中。而 sRunQueues 內部是通過 ThreadLocal 來保存 RunQueue 的,這意味著不同線程獲取到的 RunQueue 是不同對象,這也意味著如果我們在子線程中調用View.post(Runnable) 方法的話,該 Runnable 永遠不會被執行,因為主線程根本無法獲取到子線程的 RunQueue

static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();static RunQueue getRunQueue() { RunQueue rq = sRunQueues.get(); if (rq != null) { return rq; } rq = new RunQueue(); sRunQueues.set(rq); return rq; }

此外,由于sRunQueues 是靜態成員變量,主線程會一直對應同一個 RunQueue 對象,如果我們是在主線程中調用View.post(Runnable)方法的話,那么該 Runnable 就會被添加到和主線程關聯的 RunQueue 中,后續主線程就會取出該 Runnable 來執行

即使該 View 是我們直接 new 出來的對象(就像以下的示例),以上結論依然生效,當系統需要繪制其它視圖的時候就會順便取出該任務,一般很快就會執行到。當然,由于此時 View 并沒有 AttachedToWindow,所以獲取到的寬高值肯定也是 0

val view = View(Context) view.post { getWidthHeight('view.Post') }

對View.post(Runnable)方法的兼容性問題做下總結:

當 API < 24 時,如果是在主線程進行調用,那么不管 View 是否有 AttachedToWindow,提交的 Runnable 均會被執行。但只有在 View 被 AttachedToWindow 的情況下才可以獲取到 View 的真實寬高 當 API < 24 時,如果是在子線程進行調用,那么不管 View 是否有 AttachedToWindow,提交的 Runnable 都將永遠不會被執行 當 API >= 24 時,不管是在主線程還是子線程進行調用,只要 View 被 AttachedToWindow 后,提交的 Runnable 都會被執行,且都可以獲取到 View 的真實寬高值。如果沒有被 AttachedToWindow 的話,Runnable 也將永遠不會被執行

以上就是Android View.Post 的原理及缺陷的詳細內容,更多關于Android View.Post的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 午夜精品久久久 | 黄色片在线 | 成人精品电影 | 久久国产精品99久久久久久牛牛 | 日韩欧美一级片 | 亚洲日本乱码一区两区在线观看 | 欧美日韩亚洲国产 | 五月天婷婷激情视频 | 天天综合网网欲色 | 成人综合网站 | 亚洲人免费视频 | 国产精品高潮呻吟 | 亚洲一区二区中文字幕 | 日韩精品免费 | 国产精品一区久久久久 | 久久久亚洲 | 久久久久网站 | 日韩毛片在线观看 | 国产精品久久久久久久久大全 | 精品视频一区二区 | 日日干夜夜操 | 久久久精品一区二区三区 | 久久久99久久久国产自输拍 | 91爱爱| 国产裸体bbb视频 | 亚洲综合视频 | 在线观看中文视频 | 91一区二区 | 99er视频| 欧美人成在线视频 | 亚洲免费精品 | 精品国产一区在线 | 久久爱电影 | 一级全黄少妇性色生活片免费 | 国产视频久久 | 欧美日韩在线观看一区二区 | 国产成人av综合 | 精品自拍视频 | 日韩视频免费在线观看 | 久久久久国产一区二区三区四区 | 久久a国产 | 午夜精品一区二区三区在线播放 | 一区二区三区有限公司 | 性视频网站免费 | 毛片视频网站 | 天天天天天天天天干 | 伊人色综合网 | 日韩精品免费在线视频 | 成人免费一区二区三区视频网站 | 婷婷精品视频 | 激情五月婷婷综合 | 99国产精品久久久 | 国产探花在线看 | 免费国产网站 | 久久精品久久久久 | 国产亚洲精品久 | 在线免费观看成年人视频 | 国产成人精品一区二区三区四区 | 久久久夜 | 日本亚洲国产一区二区三区 | 亚洲精品在线看 | 国产精品 日韩 | 精品一区二区在线观看 | 国产aaaaav久久久一区二区 | 国产精品三级在线 | 亚洲视频一区二区三区四区 | 亚洲视频综合 | 五月婷婷在线观看视频 | 中文字幕日韩在线视频 | 精品欧美乱码久久久久久 | 午夜私人影院在线观看 | 99热日本 | 日韩毛片免费在线观看 | theporn国产在线精品 | 日韩一级| 国产96视频 | 免费观看成人毛片 | 国产成人精品一区二区 | 国产美女自拍视频 | 日本三级中国三级99人妇网站 | 久久精品亚洲一区二区 | 国产精品无码久久久久 | 成人亚洲在线观看 | 一区欧美| 亚洲精品国产二区 | 日韩精品一区二区三区在线播放 | 欧美一级在线观看 | 91精品国产777在线观看 | 午夜在线视频免费观看 | 国产精品久久一区 | 久久精品1区2区 | 日韩不卡一区二区 | 国产精品免费av | 国产1区在线观看 | 丁香婷婷综合激情五月色 | 成人亚洲天堂 | 91麻豆精品国产91久久久更新资源速度超快 | 久久综合九色综合欧美狠狠 | 欧美日本免费 | 国产91 在线播放 | 国产一区二区视频精品 | 亚洲精品一区二区三区在线看 | 久久久国产一区二区三区 | 久久国产精品视频 | 亚洲综合区 | 五月婷婷天 | 久久久久久久久综合 | 看片一区 | 成人免费一区二区三区视频网站 | 最新亚洲黄色网址 | 日本黄色免费播放 | 亚洲中午字幕 | 国产精品久久久久久久久久 | 动漫羞免费网站中文字幕 | 亚洲精品中文字幕乱码无线 | 综合精品久久久 | 国产97免费视频 | 日韩欧美网 | 龙珠z国语291集普通话 | 久久1区 | 日韩在线免费 | 国产99久久久精品视频 | 在线高清av | 精品久久久久久国产三级 | 亚洲国产精品99久久久久久久久 | 亚洲国产精品成人 | 国产精品1区2区3区 午夜视频网站 | 伊人爱爱网 | 欧美成年黄网站色视频 | 91精品国产日韩91久久久久久 | 一级a性色生活片毛片 | 欧美涩涩网站 | www.91在线 | 日韩欧美精品一区二区三区 | 亚洲国产精品一区二区www | 成人免费视频网站在线看 | 男女中文字幕 | 综合国产| 亚洲免费在线观看 | 国产精品久久久久久久久免费 | 一区不卡 | 国产精品美女久久久久aⅴ国产馆 | 草久在线视频 | 国产99999 | 国产精品成人久久久久 | 老汉色影院 | 一区久久 | 精品一区二区三区免费看 | 日韩视频在线免费观看 | 日韩在线精品视频 | 中文字幕在线观看 | 黑人av| 色在线看| 91精品国产一区二区 | a免费在线 | 在线成人免费 | 欧美精品一区在线观看 | 欧美性网| 久久r免费视频 | 玖玖视频 | 国产精品美女久久久久久久网站 | 日韩av免费在线观看 | 在线国产91 | 亚洲激情网站 | 成人做爰www免费看视频网站 | 91久久夜色精品国产网站 | 亚洲国产精品第一区二区 | 中文字幕 国产精品 | 一区二区三区欧美在线 | 超碰97av| 中文字幕亚洲精品 | 国产精品18久久久久久首页狼 | 情一色一乱一欲一区二区 | av大片在线观看 | 99精品国产在热久久 | 蜜桃毛片 | 97国产精品| 美女久久| 国产精品亚洲第一区在线暖暖韩国 | 久久久久久久91 | 日韩欧美国产一区二区三区 | 性色av一区二区三区免费看开蚌 | 欧美一级毛片免费看 | 视频一区二区三区在线观看 | 91影库| 日韩欧美在线视频免费观看 | 亚洲综合在 | 国产精品夜夜春夜夜爽久久电影 | 吴梦梦到粉丝家实战华中在线观看 | 国产精品久久久久久福利一牛影视 | 欧美日本国产 | 99re在线免费| 婷婷激情五月 | 欧美日韩综合视频 | 亚洲一区二区三区四区在线观看 | 亚洲视频在线看 | 久久久久久艹 | 91色乱码一区二区三区 | 国产精品综合一区二区 | 国产乱码一区二区三区在线观看 | 免费黄色小片 | 国产欧美精品一区二区三区四区 | 一级片网 | 九九热精品视频 | 天天干天天操 | 久草av在线播放 | 久久精品综合 | 久久久久久久久国产 | 国产成人啪精品午夜在线观看 | 国产欧美精品一区二区 | 国产精品久久久久久久午夜片 | 精品久久久久久久久久久院品网 | 成人欧美一区二区三区在线观看 | 亚洲一级在线 | 在线播放亚洲 | 日本三级中国三级99人妇网站 | 看毛片网 | 午夜视频网 | 国产亚洲欧美精品永久 | 亚洲毛片在线 | 亚洲精品字幕 | 国产1区2区3区 | 亚洲这里只有精品 | 亚洲免费一区二区 | 99久久99久久精品国产片果冻 | 欧美日韩久久 | 午夜精品久久久久久久白皮肤 | 伊人网网站 | 国产三级网站 | 欧美在线观看免费观看视频 | 日韩不卡在线 | 久久免费在线观看 | 欧美日本一区 | 欧美8一10sex性hd | 亚洲中出| yy6080久久伦理一区二区 | 人人草天天草 | 色视频在线免费观看 | 中文字幕av一区二区三区 | 在线观看 亚洲 | 国产精品久久久久久久久久99 | 日韩3级在线观看 | 欧美在线a | 久久精品国产99国产精品 | 台湾av片| 日日摸夜夜添夜夜添亚洲女人 | 国产精品日韩欧美 | 国产精品国产a级 | 天天干天天看天天操 | 欧美在线播放一区 | 久草热8精品视频在线观看 黄色片网站视频 | 日韩精品一二三区 | 日韩精品99久久久久中文字幕 | 久久小视频| 躁躁躁日躁夜夜躁 | 久久久久成人精品 | 在线观看www | 精品国产不卡一区二区三区 | 国产精品成人观看视频国产奇米 | 国产精品夜间视频香蕉 | 最新国产在线 | 久久综合一区二区三区 | h成人在线 | 亚洲精品久久久一区二区三区 | 国产精品二区一区二区aⅴ污介绍 | 波多野结衣 一区二区三区 精品精品久久 | caoporn国产精品免费公开 | 亚洲精品一二区 | 久久久久久久网站 | 久久亚洲天堂 | 亚洲激情欧美 | 蜜臀精品久久久久久蜜臀 | 精品亚洲一区二区三区在线观看 | 日韩免费视频 | 国产欧美日韩综合精品 | 成人av在线播放 | 亚洲视频免费在线观看 | 99久热在线精品视频观看 | 伊人短视频 | 亚洲午夜精品一区二区三区 | 2012中文版免费观看 | 亚洲国产精品久久久男人的天堂 | 日韩国产精品视频 | 日本狠狠操 | 成人看片网 | 国产精品美女www爽爽爽动态图 | 亚洲精品一区二区在线 | 日韩和的一区二区 | 免费成人在线视频网站 | 午夜看看 | 日韩精品免费在线观看 | 国产日韩欧美在线观看 | 日韩精品免费在线观看 | 黄a一级| 中文字幕亚洲一区二区三区 | 亚洲精品久久久狠狠狠爱 | www免费网站在线观看 | 国产精品毛片久久久久久久 | 亚洲成a人v欧美综合天堂麻豆 | 欧美国产一区二区三区 | 成人av播放 | 伊人最新网址 | 成人激情视频在线 | 久久久久中文字幕 | 欧美精品在线免费观看 | 亚洲成人免费在线观看 | 久草免费在线视频 | 综合色播 | 欧美成人激情 | 亚洲成人一区二区 | 综合久久国产九一剧情麻豆 | av性色 | 天堂av2020| a√免费视频 | 国产一区二区精品在线观看 | 好姑娘影视在线观看高清 | 国产精品久久久久久久久 | porn在线视频| 久久精品免费电影 | 国内在线精品 | 精品国产欧美一区二区三区不卡 | 桃色五月| 亚洲美女在线视频 | 国产精品乱码一区二区三区 | 国产精品有限公司 | 日日操狠狠操 | 日韩欧美三区 | 亚洲高清免费视频 | 日日夜夜精品免费视频 | 亚洲成人精品一区 | 亚洲综合一区二区 | 日韩一区二区黄色片 | 高清一区二区三区 | 久久久影视 | 欧美高清一区 | 亚洲视频在线免费观看 | 精品99在线 | 亚洲 欧美 在线 一区 | 国产精品污www在线观看 | 国产精品自产av一区二区三区 | 亚洲精品国产第一综合99久久 | 欧美一级二级三级视频 | 国产第一区在线观看 | 欧美一级免费在线观看 | 欧美精品xx | 北条麻妃99精品青青久久 | 日本二区视频 | 日本电影网址 | 91在线观看视频 | 日本免费网站 | 日韩精品一二三 | 日韩国产在线播放 | 日韩精品专区在线影院重磅 | 国产欧精精久久久久久久 | 欧美一级在线观看 | 91精品久久久久久久久久小网站 | 国产成人久久 | 自拍视频在线播放 | 欧美精品99 | 国产中文在线 | 日韩成人在线播放 | 国产成人av在线播放 | 国产精品久久久久久吹潮 | 百性阁综合另类 | 欧美日韩精品一区二区三区在线观看 | 国产一级免费视频 | 涩涩视频观看 | 亚洲一区二区三 | 综合久久综合久久 | 亚洲精品久久久久久下一站 | 欧美日韩一级电影 | 日韩视频欧美视频 | 国产97久久 | 亚洲午夜成激人情在线影院 | 国产午夜精品一区二区三区免费 | 最近日韩中文字幕 | 91精品国产色综合久久不卡98口 | 国产高清视频 | 日韩免费观看视频 | 国产精品久久久久久久 | 亚洲国产精品久久 | 色综合一区二区三区 | 免费一区二区 | 日本成人中文字幕在线观看 | 国产一区二区三区久久久 | 国产精品自产拍在线观看 | 精品久久99 | 色婷婷综合在线 | 精品三级在线观看 | 91精品国产综合久久久久久丝袜 | 激情欧美一区二区三区中文字幕 | 全免一级毛片 | 精品国产一区二区三区久久久蜜月 | 亚洲a网| 国产免费一区二区 | 特级淫片裸体免费看 | 国产欧美一二三区在线粉嫩 | 国产精品亚洲视频 | 在线播放91 | 国产成人精品久久 | 国产综合久久 | 久久精品99国产精品日本 | 午夜影院普通用户体验区 | 国产激情视频在线 | 久久久久久久网站 | 免费一区在线 | 国产成人精品免高潮在线观看 | 91 在线 | 成人国产一区 | xx视频在线观看 | 亚洲日韩成人 | 国产九九在线观看 | 国产中文在线 | 97国产精品视频人人做人人爱 | 欧美日韩一区二区视频在线观看 | 欧美一区二区在线 | 免费在线国产 | av网站观看 | 中文字幕乱码一区二区三区 | 国产欧美在线视频 | 成人精品视频一区二区三区 | 国产91视频一区二区 | 国产www网站| 亚洲 欧美日韩 国产 中文 | 欧美一级精品片在线看 | 综合久久99 | 黄a免费看 | 日韩中文字幕电影 | 国产成人精品免费 | 久久国产精品99久久久久久牛牛 | 国产在线激情视频 | 一区二区三区国产精品 | 久久综合久久久 | jizz在线观看| 午夜一级片| 免费国产视频 | 亚洲视频一区二区在线 | 黄色片免费在线 | 香蕉av777xxx色综合一区 | 日韩成人在线播放 | 日本不卡一区二区 | 伊人春色网 | 国产色在线 | 天天爽夜夜春 | 超碰人人射 | 日韩精品日韩激情日韩综合 | 欧美色性 | 午夜不卡一区二区 | 中文字幕一区二区在线观看 | 日韩二区三区 | 久久91视频 | 欧美日韩精品一二区 | 国产日韩精品视频 | 中文视频一区 | 91激情视频 | 成人免费毛片aaaaaa片 | 国产欧美综合一区二区三区 | 国产精品久久久爽爽爽麻豆色哟哟 | 国产精品久久久久久久久久免费看 | 伊人青青久久 | 国产大片久久久 | 国产精品免费观看 | 一区二区三区四区不卡视频 | a级在线免费视频 | 日韩视频网 | 日日爱夜夜爱 | 欧美一区二区三区国产精品 | 百性阁综合另类 | www一区二区| 国产一区二区视频在线观看 | 国产一区 欧美 | 精品无码久久久久国产 | 亚洲欧美一区二区三区不卡 | 亚洲精品一区二三区 | 国产99久久久久久免费看农村 | а天堂中文最新一区二区三区 | 91欧美| 天天舔夜夜 | 在线免费视频一区 | 日韩av片在线免费观看 | 在线观看国精产品二区1819 | 国产一区 | 毛片网在线观看 | 天堂网色 | 欧美午夜一区二区三区免费大片 | 亚洲精品国产高清 | 香蕉成人啪国产精品视频综合网 | 麻豆久久久9性大片 | 美女视频一区 | 亚洲人人艹 | aⅴ色国产 欧美 | 美女黄网站视频免费 | 国产激情视频在线 | 亚洲视频在线播放 | 日韩在线不卡 | 国产在线一二 | 欧美中文| h亚洲视频 | 杨门女将寡妇一级裸片看 | 久久国产高清 | 欧美另类综合 | 成人一区二区在线 | 成人在线一区二区三区 | 日本一区二区三区免费观看 | 97在线观看视频 | 91视频在线观看 | 日韩99| 玖玖精品 | 国产高清av在线一区二区三区 | 亚洲欧美日韩精品 | 国产美女在线观看 | 91精品国产综合久久久久久 | 亚洲国内精品 | 一区二区国产精品 | www.久久精品 | 啪啪网免费| 欧美精品一区在线 | 亚洲精品国产电影 | 一区二区影视 | 91黄在线观看 | 91色爱 | 成人看片在线观看 | 在线观看中文视频 | 在线日韩欧美 | 国内精品国产成人国产三级粉色 | 超碰导航| 亚洲欧美激情精品一区二区 | 91一区| 欧美一区二区三区在线视频 | 韩国三级中文字幕hd久久精品 | 99这里只有精品 | 天天干天天操 | 欧美成人精品在线 | 欧美日韩精品在线 | 亚洲国产精品视频 | 99久久久99久久国产片鸭王 | 亚洲va中文字幕 | 在线观看免费视频a | 黄篇网址| 午夜视频一区二区三区 | 国产一级一级片 | 日韩乱码中文字幕 | 久久久久久久久久穴 | 日韩精品免费在线视频 | 91天天综合 | 91精品综合久久久久久五月天 | 成人免费视频网站在线观看 | 久久成人一区 | 中国大陆高清aⅴ毛片 | 午夜精品久久久久久久星辰影院 | 一级特黄 | 91精品国产综合久久久久久丝袜 | 午夜免费观看视频 | 国产精品久久久久免费a∨ 欧洲精品一区 | av国产精品毛片一区二区小说 | 亚洲热在线视频 | 少妇激烈床戏视频 | 日韩中文一区 | 久久久香蕉 | 伊人免费观看视频 | 国产精品成人国产乱一区 | 久久免费精品视频 | 高清国产午夜精品久久久久久 | av观看免费 | 国产 一区| 亚洲欧美精品一区二区三区 | 国产色在线 | 欧美在线一二三 | 欧美日韩在线成人 | 黄色一级片免费播放 | 五月婷婷天 | 日韩精品在线观看视频 | 日韩在线一区二区三区 | 日韩在线观看中文字幕 | 欧美视频网站 | 国产精品一区二区在线 | 精品日韩一区二区三区 | 久久亚洲一区二区 | 超碰激情 | 天堂精品久久 | 电家庭影院午夜 | 欧美一级免费观看 | 一区二区精品视频在线观看 | 国产精品久久久久久久久久东京 | 欧美成人综合在线 | 国产婷婷在线观看 | 桃花久久 | 国产伦精品一区二区三区四区视频 | 成人免费视频视频在线观看 免费 | 色黄视频在线观看 | 91污在线观看 | 自拍视频在线观看 | 国产精品毛片久久久久久久 | h视频免费看 | 日韩网站免费观看 | 国产乱肥老妇国产一区二 | 国产999精品久久久久久 | 精品日韩在线 | 国产乱码精品一区二区三区五月婷 | sese综合| 这里只有精品在线视频观看 | 亚洲精品日韩激情在线电影 | 国产精品视频久久 | 人人做人人爽 | 免费在线黄色av | 久久久高清 | 亚洲福利精品视频 | 国产色播| 亚洲a在线播放 | 成人精品视频 | 91亚洲免费| 国产精品久久久久久久久久免费看 | 嫩草精品| www国产成人免费观看视频,深夜成人网 | 操操操操操操 |