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

Android進階之后臺任務和定時服務,放棄AlarmManager全面擁抱WorkManager

移動開發 Android
WorkManager是google提供的異步執行任務的管理框架,會根據手機的API版本和應用程序的狀態來選擇適當的方式執行任務。

[[428478]]

本文轉載自微信公眾號「Android開發編程」,作者Android開發編程。轉載本文請聯系Android開發編程公眾號。

前言

WorkManager是google提供的異步執行任務的管理框架,會根據手機的API版本和應用程序的狀態來選擇適當的方式執行任務;

當應用在運行的時候會在應用的進程中開一條線程來執行任務,當退出應用時,WorkManager會選擇根據設備的API版本使用適合的算法調用JobScheduler或者Firebase JobDispatcher,或者AlarmManager來執行任務;

今天我們來介紹下;

一、WorkManager介紹

1、什么是WorkManager

  • WorkManager 是一個 API,使您可以輕松調度那些即使在退出應用或重啟設備時仍應運行的可延期異步任務。WorkManager API 是一個針對先前的 Android 后臺調度 API(包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler)的合適的建議替換組件。WorkManager 在新版一致性 API 中整合了其前身的功能,該 API 支持 API 級別 14,同時可保證電池續航時間;
  • WorkManager 適用于可延期工作,即不需要立即運行但需要可靠運行的工作,即使用戶退出或設備重啟也不受影響。例如:向后端服務發送日志或分析數據 定期將應用數據與服務器同步;
  • WorkManager 不適用于應用進程結束時能夠安全終止的運行中后臺工作,也不適用于需要立即執行的工作;

2、優點

  • 向下兼容至api 14;
  • 可以添加任務執行的約束條件,比如說 延遲執行,是否在低電量模式下執行,是否在充電模式下執行,是否在設備空閑時執行等等;
  • 調度一次性或周期性異步任務;
  • 監管任務,可以隨時取消任務;
  • 將任務鏈接起來,比如說執行可以指定多個任務的執行順序;
  • 確保任務執行,即使應用或設備重啟也同樣執行任務;

二、WorkManager使用

1、添加依賴

  1. //根據項目需要自行添加依賴,不需要全部添加 
  2.     dependencies { 
  3.       def work_version = "2.3.1" 
  4.         // (Java only
  5.         implementation "androidx.work:work-runtime:$work_version"//java 語言選這個 
  6.         // Kotlin + coroutines 
  7.         implementation "androidx.work:work-runtime-ktx:$work_version"//kotlin 選這個 
  8.       } 

2、 創建一個后臺任務

上傳圖片:

  1. class UploadPicWork( 
  2.     private val context: Context, 
  3.     private val workerParameters: WorkerParameters 
  4. ) : 
  5.     Worker(context, workerParameters) { 
  6.     override fun doWork(): Result { 
  7.         uploadPic()//具體上傳圖片的邏輯 
  8.         return Result.success() 
  9.     } 

2.1 創建一個workrequest

  1. //此處的 UploadPicWork 就是之前創建的任務 
  2. val uploadPicWork = OneTimeWorkRequestBuilder<UploadPicWork>() 
  3.                 .setConstraints(triggerContentMaxDelay).build() 

2.2執行任務

  1. //此處的 uploadPicWork 就是前一步創建的 workrequest 
  2.   WorkManager.getInstance(myContext).enqueue(uploadPicWork) 

3、復雜的任務處理

3.1 創建任務執行的約束條件

  1. //注意 以下條件都是 && 的關系 
  2. val triggerContentMaxDelay = 
  3.                 Constraints.Builder() 
  4.                 .setRequiredNetworkType(NetworkType.CONNECTED)//網絡鏈接的時候使用,避免各種網絡判斷,省時省力 
  5.                 .setRequiresDeviceIdle(false)//是否在設備空閑的時候執行 
  6.                 .setRequiresBatteryNotLow(true)//是否在低電量的時候執行 
  7.                 .setRequiresStorageNotLow(true)//是否在內存不足的時候執行 
  8.                 .setRequiresCharging(true)//是否時充電的時候執行 
  9.                 .setTriggerContentMaxDelay(1000 * 1, TimeUnit.MILLISECONDS)//延遲執行 
  10.                 .build() 

3.2 為任務添加約束條件

  1. val uploadPicWork = 
  2.                 OneTimeWorkRequestBuilder<UploadPicWork>() 
  3.                     .setConstraints(triggerContentMaxDelay)//約束條件 
  4.                     .build() 
  5.  WorkManager.getInstance(myContext).enqueue(uploadPicWork)//執行 

3.3為worker 傳遞參數

  1. //可以采用這種方式傳遞參數 
  2.    val UploadPicWork = 
  3.                 OneTimeWorkRequestBuilder<UploadPicWork>() 
  4.                     //此處set input data 需要的參數 是一個Data對象,注意只可以添加一次,如果有多個參數需要傳遞,可以封裝成一個data 數據類 
  5.                     .setInputData(workDataOf("params_tag" to "params")) 
  6.                     .setConstraints(triggerContentMaxDelay).build() 

3.4 獲取參數

  1. class UploadPicWork( 
  2.     private val context: Context, 
  3.     private val workerParameters: WorkerParameters 
  4. ) : 
  5.     Worker(context, workerParameters) { 
  6.     override fun doWork(): Result { 
  7.        val params = inputData.getString("params_tag")//獲取傳遞的參數 
  8.         uploadPic()//上傳圖片 
  9.         return Result.success() 
  10.     } 

4、Worker 的狀態

在 doWork 函數中,我們返回的 Result.success(); 我們默認 ,任務 uploadPic 函數順利的執行完成了,所以返回了 success 狀態,但是在實際開發過程中 可以能因為各種各樣的問題會導致 失敗,這時候就不能返回success了;

Worker 的各種狀態說明

  • 如果有尚未完成的前提性工作,則工作處于 BLOCKED State;
  • 如果工作能夠在滿足 約束條件 和時機條件后立即運行,則被視為處于 ENQUEUED 狀態;
  • 當 Worker 在活躍地執行時,其處于 RUNNING State;
  • 如果 Worker 返回 Result.success(),則被視為處于 SUCCEEDED 狀態。這是一種終止 State;只有 OneTimeWorkRequest 可以進入這種 State;
  • 如果 Worker 返回 Result.failure(),則被視為處于 FAILED 狀態。這也是一個終止 State;只有 OneTimeWorkRequest 可以進入這種 State。所有依賴工作也會被標記為 FAILED,并且不會運行;
  • 當取消尚未終止的 WorkRequest 時,它會進入 CANCELLED State。所有依賴工作也會被標記為 CANCELLED,并且不會運行;

5、觀察Worker 的狀態

獲取 WorkInfo

聽過 id 獲取,可以聽過 WorkManager.getWorkInfoById(UUID) 或 WorkManager.getWorkInfoByIdLiveData(UUID) 來通過 WorkRequest id 來獲取 WorkInfo;

  1. WorkManager.getInstance(this) 
  2.                 .getWorkInfoByIdLiveData(UploadPicWork.id)// 通過id 獲取 
  3.                 .observe(this, Observer { //it:WorkInfo 
  4.                     it?.apply { 
  5.                         when (this.state) { 
  6.                             WorkInfo.State.BLOCKED -> println("BLOCKED"
  7.                             WorkInfo.State.CANCELLED -> println("CANCELLED"
  8.                             WorkInfo.State.RUNNING -> println("RUNNING"
  9.                             WorkInfo.State.ENQUEUED -> println("ENQUEUED"
  10.                             WorkInfo.State.FAILED -> println("FAILED"
  11.                             WorkInfo.State.SUCCEEDED -> println("SUCCEEDED"
  12.                             else -> println("else status ${this.state}"
  13.                         } 
  14.                     } 
  15.                 }) 

通過 tag 獲取,可以利用 WorkManager.getWorkInfosByTag(String) 或 WorkManager.getWorkInfosByTagLiveData(String) 來通過 WorkRequest 的 WorkInfo 對象;

  1. //要通過 tag 獲取,則需要先設置 tag 
  2. val UploadPicWork = 
  3.                 OneTimeWorkRequestBuilder<UploadPicWork>() 
  4.                     .setInputData(workDataOf("params_tag" to "params"))//傳遞參數 
  5.                     .setConstraints(triggerContentMaxDelay)//設置約束條件 
  6.                     .addTag("tag")//設置tag 
  7.                     .build() 
  8. //獲取 workInfo 
  9. WorkManager.getInstance(this) 
  10.                 .getWorkInfosByTagLiveData("tag"
  11.                 .observe(this, Observer {it:List<WorkInfo>//此處返回的是一個集合,作為示例代碼,默認只取 0 index 
  12.                     it?.apply { 
  13.                         when (this[0].state) { 
  14.                             WorkInfo.State.BLOCKED -> println("BLOCKED"
  15.                             WorkInfo.State.CANCELLED -> println("CANCELLED"
  16.                             WorkInfo.State.RUNNING -> println("RUNNING"
  17.                             WorkInfo.State.ENQUEUED -> println("ENQUEUED"
  18.                             WorkInfo.State.FAILED -> println("FAILED"
  19.                             WorkInfo.State.SUCCEEDED -> println("SUCCEEDED"
  20.                             else -> println("else status ${this[0]}"
  21.                         } 
  22.                     } 
  23.                 }) 

6、多個Worker 的順序執行

您可以使用 WorkManager 創建工作鏈并為其排隊。工作鏈用于指定多個關聯任務并定義這些任務的運行順序。當您需要以特定的順序運行多個任務時,這尤其有用;

6.1先后順序執行單個任務

比如說有三個任務workA,workB,workC,并且執行順序只能時workA---->workB---->workC可以用如下的方式處理;

  1. WorkManager.getInstance() 
  2.     .beginWith(workA) 
  3.     .then(workB)  instance 
  4.     .then(workC) 
  5.     .enqueue(); 

上面的workA,workB,workC,都是WorkRequest的子類實現對象。WorkManager會根據上面的先后順序來執行workA,workB,workC,,但是如果執行過程中三個任務中有一個失敗,整個執行都會結束。并且返回Result.failure()

6.2先后順序執行多個任務列

有時候可能要先執行一組任務,然后再執行下一組任務,可以使用下面的方式來完成。

  1. WorkManager.getInstance() 
  2.  
  3. // First, run all the A tasks (in parallel): 
  4.  
  5. .beginWith(Arrays.asList(workA1, workA2, workA3)) 
  6.  
  7. // ...when all A tasks are finished, run the single B task: 
  8.  
  9. .then(workB) 
  10.  
  11. // ...then run the C tasks (in any order): 
  12.  
  13. .then(Arrays.asList(workC1, workC2)) 
  14.  
  15. .enqueue(); 

7、 執行重復任務

就是在給定的時間間隔內定期執行任務,比如說 每個一個小時,上報位置信息,每個3個小時備份一個日志等等;

這個時間間隔不可低于15分鐘;

  1. val triggerContentMaxDelay = 
  2.                 Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED) 
  3. //                    .setRequiresDeviceIdle(false
  4.                     .setRequiresBatteryNotLow(true
  5.                     .setRequiresStorageNotLow(true
  6.                     .setRequiresCharging(true
  7.                     .setTriggerContentMaxDelay(1000 * 1, TimeUnit.MILLISECONDS) 
  8.                     .build() 
  9. //            val UploadPicWork = 
  10. //                OneTimeWorkRequestBuilder<UploadPicWork>() 
  11. //                    .setInputData(workDataOf("params_tag" to "params")) 
  12. //                    .setConstraints(triggerContentMaxDelay) 
  13. //                    .addTag("tag"
  14. //                    .build() 
  15. // 
  16.             val build = PeriodicWorkRequestBuilder<UploadPicWork>( 
  17.                 1000 * 60 *15, 
  18.                 TimeUnit.MICROSECONDS 
  19.             ).setConstraints(triggerContentMaxDelay).build() 
  20.             WorkManager.getInstance(this).enqueue(build) 

8、取消任務執行

通過任務的ID可以獲取任務從而取消任務。任務ID可以從WorkRequest中獲取;

cancelAllWork():取消所有任務;

cancelAllWorkByTag(String tag):取消一組帶有相同標簽的任務;

cancelUniqueWork( String uniqueWorkName):取消唯一任務;

  1. UUID compressionWorkId = compressionWork.getId(); 
  2. WorkManager.getInstance().cancelWorkById(compressionWorkId); 

注意并不是所有的任務都可以取消,當任務正在執行時是不能取消的,當然任務執行完成了,取消也是意義的,也就是說當任務加入到ManagerWork的隊列中但是還沒有執行時才可以取消;

9、使用WorkManager遇到的問題

9.1使用PeriodicWorkRequest只執行一次,并不重復執行

  1. WorkManager instance= new PeriodicWorkRequest.Builder(PollingWorker.class, 10, TimeUnit.MINUTES) 
  2.                 .build(); 

原因:PeriodicWorkRequest默認的時間間隔是15分鐘如果設置的時間小于15分鐘,就會出現問題;

解決方法:設置的默認時間必須大于或等于15分鐘。另外要注意,就算設置的時間為15分鐘也不一定間隔15分鐘就執行;

9.2在doWork()方法中更新UI導致崩潰

原因:doWork()方法是在WorkManager管理的后臺線程中執行的,更新UI操作只能在主線程中進行

總結

 

在這個物欲橫流人心浮躁的社會,我們一起學習加油共勉

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2023-11-25 09:30:13

Android后臺任務

2023-11-27 19:32:25

Android

2023-12-01 08:21:51

開發者Android組件庫

2018-09-12 21:25:15

iOSAppcrash

2021-10-14 14:32:27

AndroidActiviAPI

2012-12-31 13:36:28

Android開發Alarmmanage

2022-01-10 09:05:32

Linux后臺命令

2009-06-19 20:38:49

Linux操作系統

2021-02-06 06:10:44

ifconfigip 命令系統運維

2024-02-26 08:00:00

MergeRebase開發

2023-04-26 11:59:06

Swift異步編程

2025-08-06 03:11:00

2011-10-14 16:03:30

微軟Hadoop

2011-10-14 09:27:57

Hadoop數據庫SQL Server

2010-02-22 13:01:54

HTML 5谷歌

2015-11-23 17:14:04

eBayKubernetesOpenStack

2013-12-02 09:44:33

RadwareOpenStack

2022-06-30 11:36:10

KubeSphereGitOpsLinux

2019-05-09 15:53:27

PythonR數據科學

2011-12-13 20:36:26

Android
點贊
收藏

51CTO技術棧公眾號

国产精品a成v人在线播放| 欧美 激情 在线| av男人天堂av| 99亚洲一区二区| 国产视频久久久久| 亚洲国产精品毛片av不卡在线| 午夜视频在线观看网站| 久久激情综合网| 久久久久久亚洲精品不卡| v天堂中文在线| 韩日一区二区| 亚洲精品久久7777| 欧美不卡在线一区二区三区| 中文字幕乱码视频| 精品动漫av| 一区二区三区国产视频| 国产精品19p| 成人直播视频| 一区二区三区欧美亚洲| 欧美亚洲丝袜| 亚洲AV午夜精品| 日韩影院精彩在线| 欧美激情精品久久久久| 大又大又粗又硬又爽少妇毛片 | 国产三级日本三级在线播放| av毛片在线免费看| 国产欧美一区二区精品秋霞影院| 91最新在线免费观看| 亚洲另类在线观看| 伊人精品成人久久综合软件| 在线中文字幕日韩| 人妻熟女aⅴ一区二区三区汇编| 亚洲伊人精品酒店| 色婷婷亚洲一区二区三区| 国产黄色激情视频| 日本美女高清在线观看免费| 91蜜桃免费观看视频| 翡翠波斯猫1977年美国| 91久久久久国产一区二区| 久久精品中文| 午夜精品视频在线| 九九免费精品视频| 亚洲色图二区| 在线视频中文亚洲| 亚洲一区二区自偷自拍 | 亚洲春色在线视频| 色视频免费在线观看| 国产成人自拍高清视频在线免费播放| 国产精品久久久久久久久久| 久久久久久久久久久影院| 亚洲第一毛片| 久久久视频免费观看| 青草影院在线观看| 在线成人超碰| 欧美精品做受xxx性少妇| 欧美日韩黄色网| 亚洲91精品| 久久成年人免费电影| 九九热最新地址| 午夜精品免费| 久久免费国产视频| 黄色片免费观看视频| 国产日韩欧美一区| 国产精品av免费在线观看| 黄色一级视频免费看| 石原莉奈在线亚洲二区| 国产激情综合五月久久| 美女黄页在线观看| 寂寞少妇一区二区三区| 91在线高清免费观看| 精品久久国产视频| a美女胸又www黄视频久久| 九九九九久久久久| 成人三级黄色免费网站| 亚洲欧洲日产国产综合网| 国产免费内射又粗又爽密桃视频| 欧洲性视频在线播放| 精品久久久久久久中文字幕 | 久久精品美女| 香蕉av一区二区三区| 久久夜色精品一区| 麻豆精品传媒视频| 国产精品免费播放| 国产精品不卡一区| 国产黄色激情视频| 成年网站在线视频网站| 欧美日韩国产精品一区| 欧美一区二区三区爽大粗免费 | 国产精品久久久久久久久久小说 | 亚洲国产精品成人综合色在线婷婷 | 一级黄色免费网站| 日日夜夜精品视频天天综合网| 97在线视频免费| 午夜婷婷在线观看| 麻豆精品一区二区av白丝在线| 91精品国产综合久久香蕉最新版| 国产日韩在线观看一区| 成人免费福利片| 裸模一区二区三区免费| 九七久久人人| 午夜欧美一区二区三区在线播放 | 天堂av在线一区| 国产精品日韩在线观看| av手机免费看| 久久亚洲精精品中文字幕早川悠里| 黄色91av| 中文字幕伦理免费在线视频| 亚洲福利电影网| 99视频免费播放| 国产亚洲高清在线观看| 亚洲护士老师的毛茸茸最新章节| 日本一级免费视频| 欧美激情成人在线| 国产www精品| 国产福利视频导航| 久久综合色之久久综合| 天天干天天色天天爽| 97蜜桃久久| 欧美日韩国产综合视频在线观看 | 成人av午夜电影| 色阁综合av| 欧美家庭影院| 欧美久久久久久久久中文字幕| 欧美双性人妖o0| 日韩午夜电影网| 美女国内精品自产拍在线播放| 久久午夜无码鲁丝片| 日av在线不卡| 蜜桃成人在线| 国产精品探花在线| 欧美日韩三级一区| 久久无码人妻精品一区二区三区| 99久久影视| 国产黑人绿帽在线第一区| 欧美一级做性受免费大片免费| 亚洲精品亚洲人成人网| 手机看片福利日韩| 神马日本精品| 欧美激情一二三| 在线观看视频中文字幕| 91麻豆精品在线观看| 女同性恋一区二区| 国产美女久久| 精品国产91久久久久久久妲己 | 日韩成人a**站| 69av成年福利视频| 成人免费视频国产| 亚洲欧美国产高清| 亚洲一区精品视频在线观看| 精品一区三区| 91精品国产91久久久久久久久| 99在线精品视频免费观看20| 国产亚洲精久久久久久| 99视频免费播放| 国产成人精品三级高清久久91| 久久久噜久噜久久综合| 国产99视频在线| 国产精品国产三级国产有无不卡| 青青在线免费观看视频| 伊人成综合网yiren22| 51视频国产精品一区二区| 精品国产黄色片| 亚洲国产精品天堂| 亚洲一级Av无码毛片久久精品| 一区二区日韩欧美| 91美女高潮出水| 国产三区在线观看| 欧美夫妻性生活| 亚洲人与黑人屁股眼交| 麻豆传媒一区二区三区| 一区二区视频在线观看| 国产一区精品福利| 日韩网站免费观看| 911美女片黄在线观看游戏| 国产精品久99| 亚洲制服中文字幕| 国产一区二区三区四区老人| 国产精品99久久久久久久| 久草在线资源站手机版| 国产视频精品在线| 午夜一区二区三区四区| 国产精品天天摸av网| 久久婷婷综合色| 亚洲国产精品成人| 96久久精品| 蜜臀av在线| 亚洲午夜av电影| 一区二区美女视频| 亚洲精品国产无天堂网2021| 黄色av电影网站| 国产精品日本| 视频三区二区一区| 免费精品一区二区三区在线观看| 欧美—级高清免费播放| 欧美日韩激情视频一区二区三区| 在线观看欧美精品| 久久人妻无码aⅴ毛片a片app | heyzo久久| 国产精品精品久久久| 成人在线观看免费网站| 亚洲成人久久一区| 亚洲影院在线播放| 中文字幕一区二区三区视频| 师生出轨h灌满了1v1| 国产精品亚洲欧美| 在线观看日本一区| 成人午夜大片| 国产精品美女无圣光视频| 先锋成人av| 亚洲欧洲美洲在线综合| 97在线公开视频| 天天综合网 天天综合色| 国产精品酒店视频| 91女人视频在线观看| 天天干天天av| 性8sex亚洲区入口| 福利在线小视频| 蜜桃一区二区| 成人在线视频网址| 日韩大陆av| 国产高清在线不卡| 成年女人在线看片| 日韩亚洲欧美中文高清在线| 天堂在线视频免费观看| 欧美欧美欧美欧美首页| 久久青青草视频| 成人免费在线视频| 99久久99久久精品免费| 91丨porny丨最新| 性鲍视频在线观看| 日本成人中文字幕在线视频| 日b视频免费观看| 久久精品国产99久久| 粉嫩av四季av绯色av第一区| 国产精品美女久久久久| 国产成人精品一区| 日本不卡1234视频| 久久久久久国产精品| 免费大片黄在线观看视频网站| 日韩黄色高清视频| 国产视频第二页| 制服丝袜日韩国产| 日韩免费av网站| 精品露脸国产偷人在视频| 久久久.www| 亚洲日本乱码在线观看| 人妻视频一区二区| 日本一区二区三区在线不卡| 国产伦精品一区二区三区妓女| 成人午夜激情影院| 性一交一黄一片| 国产精品资源在线观看| 国产一区二区在线观看免费视频| 日韩制服丝袜先锋影音| 欧美污视频网站| 国产欧美大片| av无码久久久久久不卡网站| 久久久久免费av| 亚洲色图都市激情| 综合日韩在线| 经典三级在线视频| 欧美在线视屏| 蜜桃视频一区二区在线观看| 亚洲成人一区| 青青草免费在线视频观看| 国产精品精品国产一区二区| 日韩精品极品视频在线观看免费| 日本黄色精品| 伊人久久av导航| 久久精品亚洲人成影院| 精品日韩在线播放| 欧美精品一卡| 精品无码国产一区二区三区av| 亚洲精品四区| 人妻有码中文字幕| 日韩国产欧美在线视频| 9久久婷婷国产综合精品性色| 性xx色xx综合久久久xx| 日本在线播放一区二区| 国产一区二区中文字幕| 韩国三级丰满少妇高潮| 国产成人一区二区精品非洲| 中文字幕18页| 不卡视频一二三四| 男人舔女人下部高潮全视频| 自拍偷拍欧美激情| 九九免费精品视频| 日韩欧美在线视频观看| 中文字幕久久久久| 7777精品伊人久久久大香线蕉经典版下载 | 久久最新网址| 相泽南亚洲一区二区在线播放| 日韩久久精品| 国产精品国产三级国产专区51| 香蕉国产精品偷在线观看不卡| 天美星空大象mv在线观看视频| 免费成人av在线| 亚洲国产第一区| 国产精品嫩草影院com| 久久久久亚洲av无码专区| 精品久久久视频| 91av久久久| 亚洲二区中文字幕| 亚乱亚乱亚洲乱妇| 久久久久久久久久久久av| 成人福利视频| 成人午夜一级二级三级| 神马午夜久久| 欧美一区二区视频在线播放| 久久先锋影音| 亚洲热在线视频| www国产亚洲精品久久麻豆| 中日韩一级黄色片| 亚洲午夜激情网页| 国产精品久久久久毛片| 日韩成人性视频| caopon在线免费视频| 欧洲精品在线视频| 免费看日产一区二区三区| 精品免费二区三区三区高中清不卡| 久久精品亚洲人成影院| 北条麻妃av高潮尖叫在线观看| 国产精品亚洲一区二区三区在线 | 欧美精品在线免费观看| 欧美日韩五码| 国产在线精品日韩| 99久久精品网| 中文字幕日本最新乱码视频| 粉嫩13p一区二区三区| 青青青视频在线播放| 欧美日韩激情美女| 国产激情视频在线播放 | 醉酒壮男gay强迫野外xx| 亚洲精品自拍动漫在线| 日韩黄色片网站| 亚洲色图在线观看| 美女搞黄视频在线观看| 91久久国产自产拍夜夜嗨| 欧美日韩精品一区二区视频| 国产情侣第一页| 国产91在线|亚洲| 国产高潮流白浆| 欧美日韩一区三区四区| 国产午夜在线观看| 57pao精品| 国产成人手机高清在线观看网站| 久久久性生活视频| 国产99久久久国产精品免费看| 国产精品免费在线视频| 欧美日韩一区成人| 最新电影电视剧在线观看免费观看| 欧美在线激情视频| 久久久免费毛片| av免费观看大全| 国产91在线|亚洲| 影音先锋亚洲天堂| 亚洲精品久久久一区二区三区 | 91视视频在线观看入口直接观看www| 国产免费无码一区二区视频| 在线播放视频一区| √天堂资源地址在线官网| 国产精品一区二区在线| 999久久久免费精品国产| 999久久久精品视频| 专区另类欧美日韩| 国产精品一区二区免费视频| 久久国内精品一国内精品| 伦一区二区三区中文字幕v亚洲| 婷婷亚洲婷婷综合色香五月| 欧美a级一区二区| 亚洲熟女少妇一区二区| 欧美人与禽zozo性伦| 在线不卡日本v二区707| 国产chinese精品一区二区| 狠狠久久婷婷| 天天插天天射天天干| 色香蕉久久蜜桃| 蜜桃视频网站在线| 91久久精品一区二区别| 国产综合视频| 一本加勒比波多野结衣| 婷婷久久综合九色国产成人| wwwxxx在线观看| 92看片淫黄大片看国产片| 国内精品美女在线观看| 荫蒂被男人添免费视频| 欧美天堂在线观看| 麻豆视频免费在线观看| av日韩中文字幕| 一区二区日本视频| 一区二区精品免费| 欧美日韩免费一区二区三区 | 国产真实乱对白精彩久久| 黄页网站免费观看| 亚洲精品视频播放| 亚洲a成人v| 国产日韩一区二区在线观看| 亚洲欧美中日韩| 免费av一级片| 国产精品久久久久影院日本|