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

如何正確的在 Android 上使用 Kotlin 協(xié)程?

移動開發(fā) Android
在 Android 中,一般是不建議直接使用 GlobalScope 的。那么,在 Android 中應(yīng)該如何正確使用協(xié)程呢?再細(xì)分一點,如何直接在 Activity 中使用呢?如何配合 ViewModel 、LiveData 、LifeCycle 等使用呢?我會通過簡單的示例代碼來闡述 Android 上的協(xié)程使用,你也可以跟著動手敲一敲。

前言

你還記得是哪一年的 Google IO 正式宣布 Kotlin 成為 Android 一級開發(fā)語言嗎?是 Google IO 2017 。如今兩年時間過去了,站在一名 Android 開發(fā)者的角度來看,Kotlin 的生態(tài)環(huán)境越來越好了,相關(guān)的開源項目和學(xué)習(xí)資料也日漸豐富,身邊愿意去使用或者試用 Kotlin 的朋友也變多了。常年混跡掘金的我也能明顯感覺到 Kotlin 標(biāo)簽下的文章慢慢變多了(其實仍然少的可憐)。今年的 Google IO 也放出了 Kotlin First 的口號,許多新的 API 和功能特性將優(yōu)先提供 Kotlin 支持。所以,時至今日,實在找不到安卓開發(fā)者不學(xué) Kotlin 的理由了。

今天想聊聊的是 Kotlin Coroutine。雖然在 Kotlin 發(fā)布之初就有了協(xié)程,但是直到 2018 年的 KotlinConf 大會上,JetBrain 發(fā)布了 Kotlin1.3RC,這才帶來了穩(wěn)定版的協(xié)程。即使穩(wěn)定版的協(xié)程已經(jīng)發(fā)布了一年之余,但是好像并沒有足夠多的用戶,至少在我看來是這樣。在我學(xué)習(xí)協(xié)程的各個階段中,遇到問題都鮮有地方可以求助,拋到技術(shù)群基本就石沉大海了。基本只能靠一些英文文檔來解決問題。

在看完官方文檔的很長一段時間,我?guī)缀踔恢?GlobalScope。的確,官方文檔上基本從頭到尾都是在用 GlobalScope 寫示例代碼。所以一部分開發(fā)者,也包括我自己,在寫自己的代碼時也就直接 GlobalScope 了。一次偶然的機(jī)會才發(fā)現(xiàn)其實這樣的問題是很大的。在 Android 中,一般是不建議直接使用 GlobalScope 的。那么,在 Android 中應(yīng)該如何正確使用協(xié)程呢?再細(xì)分一點,如何直接在 Activity 中使用呢?如何配合 ViewModel 、LiveData 、LifeCycle 等使用呢?我會通過簡單的示例代碼來闡述 Android 上的協(xié)程使用,你也可以跟著動手敲一敲。

[[279995]]

協(xié)程在 Android 上的使用

GlobalScope

在一般的應(yīng)用場景下,我們都希望可以異步進(jìn)行耗時任務(wù),比如網(wǎng)絡(luò)請求,數(shù)據(jù)處理等等。當(dāng)我們離開當(dāng)前頁面的時候,也希望可以取消正在進(jìn)行的異步任務(wù)。這兩點,也正是使用協(xié)程中所需要注意的。既然不建議直接使用 GlobalScope,我們就先試驗一下使用它會是什么效果。

  1. private fun launchFromGlobalScope() { 
  2.  GlobalScope.launch(Dispatchers.Main) { 
  3.  val deferred = async(Dispatchers.IO) { 
  4.  // network request 
  5.  delay(3000) 
  6.  "Get it" 
  7.  } 
  8.  globalScope.text = deferred.await() 
  9.  Toast.makeText(applicationContext, "GlobalScope", Toast.LENGTH_SHORT).show() 
  10.  } 

在 launchFromGlobalScope() 方法中,我直接通過 GlobalScope.launch() 啟動一個協(xié)程,delay(3000) 模擬網(wǎng)絡(luò)請求,三秒后,會彈出一個 Toast 提示。使用上是沒有任何問題的,可以正常的彈出 Toast 。但是當(dāng)你執(zhí)行這個方法之后,立即按返回鍵返回上一頁面,仍然會彈出 Toast 。如果是實際開發(fā)中通過網(wǎng)絡(luò)請求更新頁面的話,當(dāng)用戶已經(jīng)不在這個頁面了,就根本沒有必要再去請求了,只會浪費(fèi)資源。GlobalScope 顯然并不符合這一特性。https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html 中其實也詳細(xì)說明了,如下所示: 

  1. Global scope is used to launch top-level coroutines which are operating on the whole application lifetime and are not cancelled prematurely. Another use of the global scope is operators running in Dispatchers.Unconfined, which don’t have any job associated with them. 
  2.  
  3. Application code usually should use an application-defined CoroutineScope. Using async or launch on the instance of GlobalScope is highly discouraged. 

大致意思是,Global scope 通常用于啟動頂級協(xié)程,這些協(xié)程在整個應(yīng)用程序生命周期內(nèi)運(yùn)行,不會被過早地被取消。程序代碼通常應(yīng)該使用自定義的協(xié)程作用域。直接使用 GlobalScope 的 async 或者 launch 方法是強(qiáng)烈不建議的。

GlobalScope 創(chuàng)建的協(xié)程沒有父協(xié)程,GlobalScope 通常也不與任何生命周期組件綁定。除非手動管理,否則很難滿足我們實際開發(fā)中的需求。所以,GlobalScope 能不用就盡量不用。

MainScope

官方文檔中提到要使用自定義的協(xié)程作用域,當(dāng)然,Kotlin 已經(jīng)給我們提供了合適的協(xié)程作用域 MainScope 。看一下 MainScope 的定義:

  1. public fun MainScope(): CoroutineScope = ContextScope(SupervisorJob() + Dispatchers.Main) 

記著這個定義,在后面 ViewModel 的協(xié)程使用中也會借鑒這種寫法。

給我們的 Activity 實現(xiàn)自己的協(xié)程作用域:

  1. class BasicCorotineActivity : AppCompatActivity(), CoroutineScope by MainScope() {} 

通過擴(kuò)展函數(shù) launch() 可以直接在主線程中啟動協(xié)程,示例代碼如下:

  1. private fun launchFromMainScope() { 
  2.  launch { 
  3.  val deferred = async(Dispatchers.IO) { 
  4.  // network request 
  5.  delay(3000) 
  6.  "Get it" 
  7.  } 
  8.  mainScope.text = deferred.await() 
  9.  Toast.makeText(applicationContext, "MainScope", Toast.LENGTH_SHORT).show() 
  10.  } 

最后別忘了在 onDestroy() 中取消協(xié)程,通過擴(kuò)展函數(shù) cancel() 來實現(xiàn):

  1. override fun onDestroy() { 
  2.  super.onDestroy() 
  3.  cancel() 

現(xiàn)在來測試一下 launchFromMainScope() 方法吧!你會發(fā)現(xiàn)這完全符合你的需求。實際開發(fā)中可以把 MainScope 整合到 BaseActivity 中,就不需要重復(fù)書寫模板代碼了。

ViewModelScope

如果你使用了 MVVM 架構(gòu),根本就不會在 Activity 上書寫任何邏輯代碼,更別說啟動協(xié)程了。這個時候大部分工作就要交給 ViewModel 了。那么如何在 ViewModel 中定義協(xié)程作用域呢?還記得上面 MainScope() 的定義嗎?沒錯,搬過來直接使用就可以了。

  1. class ViewModelOne : ViewModel() { 
  2.  private val viewModelJob = SupervisorJob() 
  3.  private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob) 
  4.  val mMessage: MutableLiveData<String> = MutableLiveData() 
  5.  fun getMessage(message: String) { 
  6.  uiScope.launch { 
  7.  val deferred = async(Dispatchers.IO) { 
  8.  delay(2000) 
  9.  "post $message" 
  10.  } 
  11.  mMessage.value = deferred.await() 
  12.  } 
  13.  } 
  14.  override fun onCleared() { 
  15.  super.onCleared() 
  16.  viewModelJob.cancel() 
  17.  } 

這里的 uiScope 其實就等同于 MainScope。調(diào)用 getMessage() 方法和之前的 launchFromMainScope() 效果也是一樣的,記得在 ViewModel 的 onCleared() 回調(diào)里取消協(xié)程。

你可以定義一個 BaseViewModel 來處理這些邏輯,避免重復(fù)書寫模板代碼。然而 Kotlin 就是要讓你做同樣的事,寫更少的代碼,于是 viewmodel-ktx 來了。看到 ktx ,你就應(yīng)該明白它是來簡化你的代碼的。引入如下依賴:

  1. implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha03" 

然后,什么都不需要做,直接使用協(xié)程作用域 viewModelScope 就可以了。viewModelScope 是 ViewModel 的一個擴(kuò)展屬性,定義如下:

  1. val ViewModel.viewModelScope: CoroutineScope 
  2.  get() { 
  3.  val scope: CoroutineScope? = this.getTag(JOB_KEY) 
  4.  if (scope != null) { 
  5.  return scope 
  6.  } 
  7.  return setTagIfAbsent(JOB_KEY, 
  8.  CloseableCoroutineScope(SupervisorJob() + Dispatchers.Main)) 
  9.  } 

看下代碼你就應(yīng)該明白了,還是熟悉的那一套。當(dāng) ViewModel.onCleared() 被調(diào)用的時候,viewModelScope 會自動取消作用域內(nèi)的所有協(xié)程。使用示例如下:

  1. fun getMessageByViewModel() { 
  2.  viewModelScope.launch { 
  3.  val deferred = async(Dispatchers.IO) { getMessage("ViewModel Ktx") } 
  4.  mMessage.value = deferred.await() 
  5.  } 

寫到這里,viewModelScope 是能滿足需求的最簡寫法了。實際上,寫完全篇,viewModelScope 仍然是我認(rèn)為的最好的選擇。

LiveData

Kotlin 同樣為 LiveData 賦予了直接使用協(xié)程的能力。添加如下依賴:

  1. implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha03" 

直接在 liveData {} 代碼塊中調(diào)用需要異步執(zhí)行的掛起函數(shù),并調(diào)用 emit() 函數(shù)發(fā)送處理結(jié)果。示例代碼如下所示:

  1. val mResult: LiveData<String> = liveData { 
  2.  val string = getMessage("LiveData Ktx"
  3.  emit(string) 

你可能會好奇這里好像并沒有任何的顯示調(diào)用,那么,liveData 代碼塊是在什么執(zhí)行的呢?當(dāng) LiveData 進(jìn)入 active 狀態(tài)時,liveData{ } 會自動執(zhí)行。當(dāng) LiveData 進(jìn)入 inactive 狀態(tài)時,經(jīng)過一個可配置的 timeout 之后會自動取消。如果它在完成之前就取消了,當(dāng) LiveData 再次 active 的時候會重新運(yùn)行。如果上一次運(yùn)行成功結(jié)束了,就不會再重新運(yùn)行。也就是說只有自動取消的 liveData{ } 可以重新運(yùn)行。其他原因(比如 CancelationException)導(dǎo)致的取消也不會重新運(yùn)行。

所以 livedata-ktx 的使用是有一定限制的。對于需要用戶主動刷新的場景,就無法滿足了。在一次完整的生命周期內(nèi),一旦成功執(zhí)行完成一次,就沒有辦法再觸發(fā)了。 這句話不知道對不對,我個人是這么理解的。因此,還是 viewmodel-ktx 的適用性更廣,可控性也更好。

LifecycleScope

  1. implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha03" 

lifecycle-runtime-ktx 給每個 LifeCycle 對象通過擴(kuò)展屬性定義了協(xié)程作用域 lifecycleScope 。你可以通過 lifecycle.coroutineScope 或者 lifecycleOwner.lifecycleScope 進(jìn)行訪問。示例代碼如下:

  1. fun getMessageByLifeCycle(lifecycleOwner: LifecycleOwner) { 
  2.  lifecycleOwner.lifecycleScope.launch { 
  3.  val deferred = async(Dispatchers.IO) { getMessage("LifeCycle Ktx") } 
  4.  mMessage.value = deferred.await() 
  5.  } 

當(dāng) LifeCycle 回調(diào) onDestroy() 時,協(xié)程作用域 lifecycleScope 會自動取消。在 Activity/Fragment 等生命周期組件中我們可以很方便的使用,但是在 MVVM 中又不會過多的在 View 層進(jìn)行邏輯處理,viewModelScope 基本就可以滿足 ViewModel 中的需求了,lifecycleScope 也顯得有點那么食之無味。但是他有一個特殊的用法:

  1. suspend fun <T> Lifecycle.whenCreated() 
  2. suspend fun <T> Lifecycle.whenStarted() 
  3. suspend fun <T> Lifecycle.whenResumed() 
  4. suspend fun <T> LifecycleOwner.whenCreated() 
  5. suspend fun <T> LifecycleOwner.whenStarted() 
  6. suspend fun <T> LifecycleOwner.whenResumed() 

可以指定至少在特定的生命周期之后再執(zhí)行掛起函數(shù),可以進(jìn)一步減輕 View 層的負(fù)擔(dān)。

 

責(zé)任編輯:未麗燕 來源: 安卓巴士
相關(guān)推薦

2023-10-24 19:37:34

協(xié)程Java

2020-06-19 08:01:48

Kotlin 協(xié)程編程

2020-04-08 09:06:34

Android 協(xié)程開發(fā)

2020-07-07 09:19:28

Android 協(xié)程開發(fā)

2021-05-20 09:14:09

Kotlin協(xié)程掛起和恢復(fù)

2020-04-23 09:33:32

Android 協(xié)程開發(fā)

2025-08-08 08:23:49

2021-09-16 09:59:13

PythonJavaScript代碼

2021-08-04 16:19:55

AndroidKotin協(xié)程Coroutines

2023-09-03 19:13:29

AndroidKotlin

2020-02-19 14:16:23

kotlin協(xié)程代碼

2023-11-17 11:36:59

協(xié)程纖程操作系統(tǒng)

2025-05-16 08:21:45

2021-04-28 09:08:23

Kotlin協(xié)程代碼

2020-02-24 10:39:55

Python函數(shù)線程池

2024-02-05 09:06:25

Python協(xié)程Asyncio庫

2025-06-26 04:10:00

2024-06-27 07:56:49

2022-08-10 13:12:04

Linuxcat命令

2014-04-09 09:32:24

Go并發(fā)
點贊
收藏

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

欧美性大战久久久久xxx | 成熟的女同志hd| 日韩中文在线| 亚洲成av人影院| 蜜桃视频在线观看91| 在线观看国产精品入口男同| 亚洲欧洲日韩| 亚洲国产一区自拍| 黄色三级视频在线| 欧美亚洲系列| 国产亚洲人成网站| 91亚洲午夜在线| 老熟妇仑乱一区二区av| 亚洲综合婷婷| 亚洲欧美日韩视频一区| 国产三级三级看三级| 国产精品偷拍| 成人欧美一区二区三区在线播放| 激情视频一区二区| 国产毛片久久久久| 日韩电影免费在线看| 久久精品视频在线| a级大片在线观看| 中文字幕日韩高清在线| 欧美专区亚洲专区| 欧美成人高潮一二区在线看| 欧美a免费在线| 91蜜桃免费观看视频| 亚洲va欧美va国产综合久久| 亚洲大尺度在线观看| 亚洲国产精品第一区二区| 色吧影院999| 欧美多人猛交狂配| 高清日韩中文字幕| 91精品在线免费| 乌克兰美女av| 美女福利一区二区| 亚洲不卡在线观看| 久久久久久久久影视| 黑人与亚洲人色ⅹvideos| av高清不卡在线| 99久久精品免费看国产一区二区三区| 在线免费av片| 奇米888四色在线精品| 欧美亚洲国产另类| 日本三级网站在线观看| 欧美韩国一区| 欧美巨猛xxxx猛交黑人97人| 久久高清内射无套| 午夜国产一区二区| 精品国产欧美一区二区三区成人| 久久国产柳州莫菁门| 色综合久久中文| 亚洲免费福利视频| 99久久久久久久久久| 日韩成人av在线资源| 亚洲国产精品视频在线观看| 又色又爽又黄18网站| 一区二区三区在线免费看| 日韩一区二区视频| 日本黄色一级网站| 色妞ww精品视频7777| 精品少妇一区二区三区视频免付费| 天美一区二区三区| 国产专区精品| 日韩欧美国产小视频| 一级全黄裸体片| 波多野结衣欧美| 亚洲国产高潮在线观看| 色婷婷免费视频| 亚洲老女人视频免费| 亚洲欧美激情在线视频| 久久中文字幕精品| 韩日一区二区三区| 中文字幕无线精品亚洲乱码一区 | 26uuu亚洲伊人春色| 婷婷激情五月网| 可以看av的网站久久看| 国产精品视频精品| 国产普通话bbwbbwbbw| 国产精品456| 国产一级精品aaaaa看| 日韩二区三区| 国产精品福利一区二区| 特级黄色录像片| 国产亚av手机在线观看| 欧美色道久久88综合亚洲精品| 日韩精品一区二区三区不卡| 亚洲精品大全| 精品第一国产综合精品aⅴ| 在线观看av中文字幕| 精品无人区麻豆乱码久久久| 久久这里只有精品99| 日本三级2019| 蜜桃一区二区三区四区| 97国产超碰| 久蕉在线视频| 亚洲精品乱码久久久久久久久| 日本午夜激情视频| 国产精品久久久久久久久久齐齐| 91精品国产乱码| aaaaaav| 成人影院在线| 久久久亚洲成人| 中文字幕日产av| 不卡在线观看av| 亚洲韩国在线| 黄色激情在线播放| 91精品国产欧美一区二区18 | 久草综合在线观看| av在线精品| 亚洲欧洲日产国产网站| 青青草激情视频| 免费高清不卡av| 精品国产中文字幕| 99在线播放| 欧洲国内综合视频| 中文字幕三级电影| 国产精品99一区二区三区| 欧美亚洲视频在线看网址| 国产精品久久久久精| 久久日韩粉嫩一区二区三区| 99热这里只有精品免费| 久久久久伊人| 亚洲午夜精品久久久久久性色 | 国产精品久久| 国产伦精品一区二区三区精品视频| 图片区 小说区 区 亚洲五月| 亚洲品质自拍视频网站| 91国产精品视频在线观看| 人人精品视频| 久久久久久网站| 国产精品一区二区av白丝下载| 久久久国际精品| 日韩中文字幕在线视频观看| 综合激情久久| 久久99久久久久久久噜噜| 一级黄色大片免费| 国产亚洲一区二区三区四区| 内射国产内射夫妻免费频道| 大桥未久女教师av一区二区| 久久成人18免费网站| 亚洲综合一区中| 国产精品丝袜一区| 午夜激情福利在线| 欧美禁忌电影网| 日韩av日韩在线观看| 你懂的在线网址| 日韩人在线观看| 色婷婷在线影院| 久久综合图片| 日本精品免费| 成人在线爆射| 国产一区二区三区视频在线观看 | 51精品久久久久久久蜜臀| 毛片久久久久久| 美女网站在线免费欧美精品| 午夜精品一区二区三区四区| 国产极品一区| 麻豆成人在线看| 精品久久久无码中文字幕| 玉米视频成人免费看| 野花视频免费在线观看| 黄色成人av网站| 精品国产一区二区三区免费 | 91在线色戒在线| 少女频道在线观看高清| 精品国产91洋老外米糕| 麻豆久久久久久久久久| 国产午夜亚洲精品羞羞网站| 亚洲一区二区三区四区五区xx| 欧美aaaa视频| 91精品视频在线看| 男女在线视频| 亚洲男人天堂2024| 一本色道久久综合亚洲| 亚洲一二三四区| 网站免费在线观看| 日本女优在线视频一区二区| 糖心vlog在线免费观看| 国产精品极品| 国产成人在线视频| 岛国成人毛片| 日韩高清中文字幕| 中文字幕人妻丝袜乱一区三区| 亚洲激情图片一区| 性色av蜜臀av色欲av| 麻豆成人av在线| 日韩av中文字幕第一页| 国产免费久久| 999国内精品视频在线| 日本三级一区| 久久精品最新地址| 欧美 日韩 国产 在线| 91久久奴性调教| 免费在线观看国产精品| 久久夜色精品国产欧美乱极品| 欧美午夜aaaaaa免费视频| 欧美激情五月| 日韩欧美亚洲日产国产| 视频一区中文字幕精品| 国产精品pans私拍| 欧美黄色视屏| www.欧美精品| 天堂a√在线| 欧美一级日韩一级| caoporn国产| 夜色激情一区二区| 亚洲精品视频网址| av激情亚洲男人天堂| 国产性生活一级片| 日本不卡123| 国产中文字幕二区| 中文字幕av亚洲精品一部二部| 欧美裸体网站| 国产精品香蕉| 亚洲曰本av电影| 69堂精品视频在线播放| 国语自产精品视频在线看一大j8 | 女性隐私黄www网站视频| 中文字幕一区二区三区久久网站| 欧美一区少妇| 欧美顶级毛片在线播放| 91视频最新| 日韩一级视频| 国产不卡精品视男人的天堂| 国产乱码在线| 欧美黑人xxx| 午夜在线激情影院| 久久九九全国免费精品观看| aiai在线| 亚洲视频网站在线观看| 四虎在线观看| 亚洲国产日韩欧美在线图片| 亚洲黄色精品视频| 欧美一级黄色片| 国产精品无码在线播放| 欧美日韩精品系列| 中文字幕黄色av| 欧美在线视频你懂得| 久久永久免费视频| 日本乱人伦aⅴ精品| 国内自拍视频在线播放| 精品久久久久久久久久久久久久 | 91福利小视频| 久久精品久久久久久久| 色综合天天综合网天天狠天天 | 免费黄色在线观看| 中文字幕亚洲自拍| 无遮挡的视频在线观看| 自拍偷拍亚洲在线| 拍真实国产伦偷精品| 日韩中文在线不卡| 午夜激情在线观看| www.欧美免费| 精产国品自在线www| 欧美成人高清视频| 搞黄网站在线看| 午夜精品福利视频| 中文字幕在线看片| 国产成人一区二区三区电影| 免费视频成人| 亚洲va欧美va国产综合久久| 澳门成人av| 久久国产精品一区二区三区四区 | 日韩成人在线免费视频| 午夜在线成人av| 最新中文字幕一区| 欧美三级日韩在线| a视频免费在线观看| 亚洲第一区第二区| 久久经典视频| 久久影院模特热| 91九色国产在线播放| 欧洲亚洲女同hd| 国产激情欧美| 国产精品乱子乱xxxx| 亚洲免费观看高清完整版在线观| 亚洲高清在线观看一区| 在线看片不卡| 欧美变态另类刺激| 蜜臀av性久久久久av蜜臀妖精| 999热精品视频| 北条麻妃国产九九精品视频| 欧美黄色一级生活片| 日韩毛片高清在线播放| 国产成人精品av久久| 日本乱人伦aⅴ精品| 成人av无码一区二区三区| 亚洲欧洲激情在线| av在线免费播放| 国产成人a亚洲精品| 成年永久一区二区三区免费视频| 精品国产乱码久久久久久郑州公司 | 粉嫩av免费一区二区三区| 欧美激情在线免费| 大胆欧美熟妇xx| 日韩电影免费一区| 久久性爱视频网站| 国产精品私人影院| 国产精品一区二区6| 91精品国产综合久久久蜜臀图片 | av 日韩 人妻 黑人 综合 无码| 亚洲国产电影| 妓院一钑片免看黄大片| 成人动漫一区二区三区| 99re6热在线精品视频| 精品久久久中文| 国产免费一区二区三区最新不卡| 日韩国产欧美精品一区二区三区| 麻豆传媒在线免费看| 日韩男女性生活视频| 给我免费播放日韩视频| 小说区视频区图片区| 久久久久国产精品一区二区| ass极品水嫩小美女ass| 国产精品天干天干在线综合| 国产精品久久久久久久久久久久久久久久久 | 久久综合久久综合亚洲| 国产精品白嫩白嫩大学美女| 欧美性色综合网| 日本免费一区二区三区最新| 欧美精品电影在线| 99久久99九九99九九九| 日韩精品欧美专区| 国产麻豆综合| 无码av免费精品一区二区三区| 中文字幕在线不卡国产视频| 成人h动漫精品一区二区下载| 亚洲丁香婷深爱综合| 日本三级在线观看网站| 91精品久久久久久蜜桃| 图片区亚洲欧美小说区| 九九精品久久久| 国产天堂亚洲国产碰碰| 久久中文字幕免费| 日韩电影中文字幕在线观看| free性护士videos欧美| 国产精品久久精品国产| 欧美日韩免费| 国产精九九网站漫画| 亚洲精品美国一| 国产99对白在线播放| 久久久精品一区二区| 国产aa精品| 在线观看亚洲视频啊啊啊啊| 久久国产三级精品| 国产精品美女高潮无套| 欧美系列日韩一区| av大片在线播放| 国产欧美中文字幕| 天天做综合网| 人妻少妇偷人精品久久久任期| 亚洲视频在线观看一区| 国产女人高潮时对白| 欧美精品在线网站| 免费观看亚洲视频大全| 日韩不卡视频一区二区| 国产成人一区在线| 国产精品999久久久| 亚洲国产欧美久久| 第84页国产精品| 欧美日韩在线一二三| 日本麻豆一区二区三区视频| 国产精品1区2区3区4区| 欧美人妇做爰xxxⅹ性高电影| 成人影院在线观看| 国产91精品一区二区绿帽| 黄色精品网站| 欧美狂猛xxxxx乱大交3| 欧美日韩中文字幕一区| 国产福利视频在线观看| www久久99| 久久国产99| 亚洲一二三四视频| 91麻豆精品国产91| zzzwww在线看片免费| 欧美xxxx黑人又粗又长密月| 日本va欧美va瓶| 91porn在线视频| 亚洲码在线观看| 男人亚洲天堂| 日韩免费在线观看av| 国产亚洲精品bt天堂精选| 91tv国产成人福利| 欧美极品美女电影一区| 宅男在线一区| 色婷婷综合在线观看| 午夜欧美视频在线观看| 成人好色电影| 91视频99| 美国十次了思思久久精品导航| 男女羞羞免费视频| 亚洲欧美日韩精品久久亚洲区| 91精品亚洲一区在线观看| av影院在线播放| 欧美国产乱子伦| 亚洲欧美激情国产综合久久久| 国产精品99一区| 亚洲网址在线|