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

多線程任務開發范例-Worker

系統 OpenHarmony
OpenHarmony的ArkUI應用開發框架提供了Worker和Taskpool等支持后臺多線程任務的方式,本文會通過開發范例介紹Worker的使用。在ArkUI應用開發中,有2類線程:宿主線程和Worker線程。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

概念介紹

在和應用界面進行交互操作時,如按鈕點擊、屏幕滑動,想同時執行一些耗時的操作,如網絡請求、數據下載。在應用開發中,通常使用UI線程和后臺線程來分別處理這些操作,UI線程主要負責處理UI事件和用戶交互操作,后臺線程負責耗時操作。通過創建后臺線程可以避免UI線程被阻塞,提高應用程序的響應速度和用戶體驗。

OpenHarmony的ArkUI應用開發框架提供了Worker和Taskpool等支持后臺多線程任務的方式,本文會通過開發范例介紹Worker的使用。在ArkUI應用開發中,有2類線程:宿主線程和Worker線程。創建Worker的線程被稱為宿主線程,Worker腳本程序工作的線程被稱為Worker線程。Worker線程是與主線程并行的獨立線程,通常在Worker線程中處理耗時的操作。需要注意的是,在Worker后臺線程中執行的代碼不能直接修改UI元素,UI元素的更新必須發生在UI線程中。

API接口

ArkUI的Worker線程模塊提供了構造函數接口用于創建Worker線程,并為UI線程和Worker線程提供了線程間通訊接口。關于Worker API能力詳細信息,請參考@ohos.worker。本節只進行關鍵接口解讀。

宿主線程中的構造函數

使用Worker的接口方法前,需要先構造ThreadWorker實例,ThreadWorker類繼承WorkerEventTarget。

注意:Worker還提供構造函數worker.Worker(scriptURL: string, options?: WorkerOptions),由于已經標記廢棄,請避免使用該廢棄的接口。

ThreadWorker構造函數如下:

constructor(scriptURL: string, options?: WorkerOptions)

其中,參數解釋:

參數名

類型

必填

說明

scriptURL

string

Worker執行腳本的路徑

options

WorkerOptions

Worker構造的選項。

我們來看一個構造的示例。不用擔心其中的腳步文件如何編寫,使用DevEco Studio創建Worker文件的時候,會生成模板。

import worker from '@ohos.worker';
// worker線程創建

// Stage模型-目錄同級(entry模塊下,workers目錄與pages目錄同級)
const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
// Stage模型-目錄不同級(entry模塊下,workers目錄是pages目錄的子目錄)
const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');

宿主線程中發送消息

宿主線程通過轉移對象所有權或者拷貝數據的方式向Worker線程發送消息,提供了兩個postMessage<sup>9+</sup>接口,其中一個如下所示:

postMessage(message: Object, options?: PostMessageOptions): void

其中,參數如下:

參數名

類型

必填

說明

message

Object

發送至Worker的數據,該數據對象必須是可序列化。

options

PostMessageOptions

當填入該參數時,與傳入ArrayBuffer[]的作用一致,該數組中對象的所有權會被轉移到Worker線程,

在宿主線程中將會變為不可用,僅在Worker線程中可用。

若不填入該參數,默認設置為 undefined,通過拷貝數據的方式傳輸信息到Worker線程。

示例代碼如下:

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");

workerInstance.postMessage("hello world");

var buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);

宿主線程中監聽消息

在宿主線程中,通過監聽事件來處理接收到的Worker線程中的消息。worker模塊提供了若干監聽接口,我們以onmessage為例進行講解,其他監聽方式類似,可以參考API參考文檔,不再贅述。
Worker對象的onmessage屬性表示宿主線程接收到來自其創建的Worker通過parentPort.postMessage接口發送的消息時被調用的事件處理程序,處理程序在宿主線程中執行。

onmessage?: (event: MessageEvents) => void

其中,參數如下:

參數名

類型

必填

說明

event

MessageEvents

收到的Worker消息數據。

示例代碼如下:

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.onmessage = function(e) {
    // e : MessageEvents, 用法如下:
    // let data = e.data;
    console.log("onmessage");
}

Worker線程中構造實例

ThreadWorkerGlobalScope是Worker線程用于與宿主線程通信的類,通過postMessage接口發送消息給宿主線程、通過close接口銷毀Worker線程。ThreadWorkerGlobalScope類繼承GlobalScope9+。

注意:Worker還提供worker.parentPort接口,該接口屬于廢棄接口,應避免使用。

在Worker腳本文件中,如entry\src\main\ets\workers\Worker.ts,構建實例如下:

import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';

var workerPort: ThreadWorkerGlobalScope = worker.workerPort;

Worker線程中監聽消息

ThreadWorkerGlobalScope的onmessage屬性表示Worker線程收到來自其宿主線程通過postMessage接口發送的消息時被調用的事件處理程序,處理程序在Worker線程中執行。

onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

其中,參數如下所示:

參數名

類型

必填

說明

this

ThreadWorkerGlobalScope

指向調用者對象。

ev

MessageEvents

收到宿主線程發送的數據。

示例代碼如下:

// main thread
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.postMessage("hello world");
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e) {
    console.log("receive main thread message");
}

Worker線程中發送消息

Worker線程通過轉移對象所有權或者拷貝數據的方式向宿主線程發送消息。提供了兩個postMessage9+接口,其中一個如下所示:

postMessage(messageObject: Object, options?: PostMessageOptions): void

其中,參數如下所示:

參數名

類型

必填

說明

message

Object

發送至宿主線程的數據,該數據對象必須是可序列化,序列化支持類型見其他說明

options

PostMessageOptions

當填入該參數時,與傳入ArrayBuffer[]的作用一致,該數組中對象的所有權會被轉移到宿主線程,在Worker線程中將會變為不可用,僅在宿主線程中可用。<br/>若不填入該參數,默認設置為 undefined,通過拷貝數據的方式傳輸信息到宿主線程。

線程的關閉和銷毀

銷毀worker的方式有兩種;

  • 被動銷毀

worker線程的生命周期跟隨應用。若應用退出則釋放worker資源。worker線程在執行過程中出現異常終止掉worker。

  • 主動銷毀

主動銷毀worker的方式有兩種,第一種在宿主線程調用worker.terminate();第二種在worker線程調用workerPort.close()。 worker銷毀前會觸發onexit回調,注意,onexit回調只會在宿主線程中執行。

宿主線程中銷毀worker線程的示例代碼:

const worker = new worker.ThreadWorker("entry/ets/workers/worker.ts");
worker.terminate();

Worker線程中銷毀worker線程的示例代碼:

// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e) {
    workerPort.close()
}

實現場景

我們模擬一個簡單的UI線程和Worker線程交互的場景。UI線程發送一個簡單的消息給Worker線程,觸發Worker線程中的一個耗時模擬操作,然后把結果返回UI線程進行界面展示。有點像,一個人站在山谷前,大喊一聲,過一段時間會從山谷中返回聲音。這個人就是UI線程,返回回音的山谷就是后臺線程。

設計思路

對于UI線程,只需要簡單地包含一個text和一個button。text用于展示后臺線程返回的信息,button按鈕被點擊后向后臺線程發送消息。UI線程還需要處理后臺返回的消息。

對于后臺線程,需要處理接收到UI消息,模擬一個耗時操作,然后返回。實現效果如下:

發送消息前

等待返回

消息返回

多線程任務開發范例-Worker-開源基礎軟件社區多線程任務開發范例-Worker-開源基礎軟件社區

多線程任務開發范例-Worker-開源基礎軟件社區多線程任務開發范例-Worker-開源基礎軟件社區

多線程任務開發范例-Worker-開源基礎軟件社區多線程任務開發范例-Worker-開源基礎軟件社區

開發步驟

創建Worker

DevEco Studio提供了非常方便的創建Worker的方法。

在DevEco Studio工程中,選擇entry,右鍵菜單選擇New-Worker,輸入Worker名稱即可,比如就使用默認的Worker。

Studio會自動為生成文件entry\src\main\ets\workers\Worker.ts,并在模塊級配置文件entry\build-profile.json5中添加workers配置,如圖所示,可以看出使用的相對路徑:‘./src/main/ets/workers/Worker.ts’。

文件entry\build-profile.json5片段:

"buildOption": {
    "sourceOption": {
      "workers": [
        './src/main/ets/workers/Worker.ts',
      ]
    }
  },

宿主進程代碼實現

我們先看下宿主進程中,代碼如何實現。

我們知道,Worker線程不可以直接操作UI。在宿主線程中,監聽到的worker線程返回消息無法直接賦值給@State變量進行UI界面渲染的。需要通過其他方式進行傳值,本示例中我們使用AppStorage和@Watch裝飾器。

如代碼所示,創建一個workerResult變量,當該變量發生變化后,會通過執行監聽函數workerResultChanged(),把存儲的值賦值給@State變量。

在宿主線程中創建的worker實例為threadWorker,它負責通過腳本文件創建worker線程,并負責執行和worker線程的通訊交互。

在宿主線程中,界面中包含一個文本,展示文字,如果從worker進程中接收到的消息等,還有一個按鈕,點擊時會觸發發worker線程發送消息。

在Button的onClick()函數中,主要實現了2個功能,一個是定義宿主線程接收到worker消息的回調函數。從代碼中可以看出,當接收到消息后,會保存到AppStorage里。

另外一個功能點是,通過調用postMessage接口,向worker線程發送消息。

在宿主線程中,還支持很多監聽函數,限于篇幅,不再展示,可以參考API自行實現。

import worker from '@ohos.worker';
let workerResult = AppStorage.Link('workerResult')

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @StorageLink('workerResult') @Watch('workerResultChanged') workerResult: String = ''
  threadWorker: worker.ThreadWorker = new worker.ThreadWorker("entry/ets/workers/Worker.ts")

  workerResultChanged() {
    this.message = AppStorage.Get('workerResult')
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
        Button('Click').onClick(
          () => {
            this.threadWorker.onmessage = function (message) {
              AppStorage.Set<String>('workerResult', message.data)
            }
            this.threadWorker.postMessage("message from main thread.")
          }
        )
      }
      .width('100%')
    }
    .height('100%')
  }
}

Worker進程代碼實現

我們再看下Worker進程中,代碼如何實現。Work線程腳本文件entry\src\main\ets\workers\Worker.ts。

語句var workerPort: ThreadWorkerGlobalScope = worker.workerPort;用于構建Worker線程中的實例對象,該實例可以與宿主線程進行消息交互。

在workerPort.onmessage監聽函數中,控制臺打印輸出從宿主線程中接收到的消息,然后通過workerPort.postMessage接口向宿主線程第一次發送消息,告訴宿主線程
請等待worker線程的操作。

然后,使用setTimeout函數模擬一個耗時操作,5000ms后再次向宿主線程發送消息,攜帶一個隨機數字,用于區分多次返回消息的差異。

在worker線程中的其他監聽函數,如workerPort.onmessageerror、workerPort.onerror,或者銷毀worker線程的操作可以參考API自行實現。

文件entry\src\main\ets\workers\Worker.ts片段:

import worker from '@ohos.worker';
import { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';

var workerPort: ThreadWorkerGlobalScope = worker.workerPort;

workerPort.onmessage = function (e: MessageEvents) {
  console.info("onmessage: " + e.data)
  workerPort.postMessage("Waiting for the worker ...")
  setTimeout(() => {
    console.info('send to main thread')
    workerPort.postMessage("Echo from worker Random: " 
    + Math.round(100 * Math.random()))
  },
    5000)
}

運行測試效果

代碼編寫完畢,可以測試運行查看效果。推薦在模塊級配置文件entry\build-profile.json5中,修改運行時為"HarmonyOS",這樣就可以在DevEco Studio中使用Simulator模擬器進行運行測試,手頭沒有設備也可以輕松體驗OpenHarmony應用開發。

注意事項

Worker線程不可以直接操作UI,@State等變量無法直接進行賦值渲染,需要通過其他方式進行傳值。在本開發范例中, 就借助了AppStorage。

Worker線程不使用時,請及時銷毀,避免耗用資源。Worker有資源限制,如果創建數量太多,可以報如下錯誤:

Error message: Worker initialization failure, the number of workers exceeds the maximum.
SourceCode:
this.threadWorker = new worker.ThreadWorker("entry/ets/workers/Worker.ts");

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-08-02 09:29:40

任務池TaskPool

2023-01-17 17:45:28

UI界面多線程

2010-02-04 10:19:39

C++多線程

2021-09-09 07:16:00

C#多線程開發

2011-05-31 13:29:40

Android 多線程

2015-11-18 18:56:36

Java多線程處理

2015-07-22 09:51:51

iOS開發線程

2015-07-22 09:39:38

IOS多線程同步

2009-08-13 09:07:36

Java多線程

2009-07-17 17:29:13

多任務多線程

2019-09-26 10:19:27

設計電腦Java

2022-04-14 11:44:25

LiteOS線程鴻蒙

2022-10-11 08:00:47

多線程開發技巧

2010-03-18 10:36:23

Java語言規范

2011-08-18 17:07:23

IOS開發多線程NSInvocatio

2015-07-08 09:56:25

Notificatio多線程

2011-08-12 10:09:23

iPhone開發多線程

2009-09-22 17:21:24

線程局部變量

2009-03-12 10:52:43

Java線程多線程

2013-08-21 16:17:09

iPhone多線程
點贊
收藏

51CTO技術棧公眾號

欧一区二区三区| 免费av网站在线| 日本a人精品| 1024亚洲合集| av在线不卡一区| 二区视频在线观看| 首页国产精品| 日韩电影在线观看中文字幕| 午夜视频在线瓜伦| 菠萝菠萝蜜在线视频免费观看| 国产成人日日夜夜| 国产福利精品视频| 欧美视频一区二区在线| 国产欧美自拍一区| 欧美色综合网站| 欧美一区二区视频在线播放| 日韩偷拍自拍| 激情国产一区二区| 欧美野外猛男的大粗鳮| 污污的视频在线免费观看| 九色丨蝌蚪丨成人| 91麻豆精品久久久久蜜臀| 尤物av无码色av无码| 免费大片在线观看www| 99久久国产综合精品色伊 | av永久免费观看| 一本色道69色精品综合久久| 欧洲视频一区二区| 欧美不卡在线播放| 97caopor国产在线视频| 久久久久国产免费免费| 国产精品9999久久久久仙踪林| 国产无遮挡呻吟娇喘视频| 欧美成人首页| 中文国产成人精品| 亚洲一级中文字幕| 大陆精大陆国产国语精品| 欧美日韩激情一区二区| 欧美亚洲另类色图| gogo高清午夜人体在线| 亚洲欧美另类综合偷拍| 亚洲成色最大综合在线| 日韩精品视频无播放器在线看| 懂色中文一区二区在线播放| 成人精品网站在线观看| 探花国产精品一区二区| 午夜亚洲性色视频| 97视频在线观看视频免费视频| 婷婷久久综合网| 国产精品国产一区| 在线激情影院一区| 日本人亚洲人jjzzjjz| 九九综合在线| 亚洲免费中文字幕| 国产中文字幕一区二区| 免费观看成人www动漫视频| 欧美成人vps| 日本少妇xxx| 久久99成人| 欧美一区二区三区不卡| 在线视频一二区| 国产精品一区二区三区四区在线观看| 欧美男人的天堂一二区| 蜜桃福利午夜精品一区| 国产精品日本一区二区三区在线| 69堂亚洲精品首页| 中文字幕日韩久久| 日韩精品中文字幕吗一区二区| 日韩一区二区免费视频| 美国黄色一级视频| 国产欧美精品一区二区三区-老狼| 中文字幕一区二区人妻痴汉电车 | 亚洲图片欧美激情| 国产日本欧美在线| 欧美xxxx免费虐| 亚洲成人动漫一区| 日韩a在线播放| 日本黄色成人| 精品日韩在线观看| 国产人妻人伦精品1国产丝袜| 天堂网av成人| 最近2019年日本中文免费字幕| 免费在线观看a级片| 午夜欧美理论片| 91精品国产99| 亚洲精品国产精品国自产网站按摩| 蜜桃免费网站一区二区三区| 91日韩在线视频| 日韩在线视频第一页| 99re在线精品| 一区二区三区观看| 国产在线xxx| 欧美中文字幕一区二区三区| 久久久九九九热| 日韩中文av| 波霸ol色综合久久| 国产一级视频在线观看| 久久一区欧美| 亚洲自拍中文字幕| 日韩三级电影网| 亚洲激情自拍偷拍| 热久久精品国产| 久久三级中文| 亚洲人高潮女人毛茸茸| 欧美日韩免费做爰视频| 久久久久久夜| 成人91免费视频| av资源网在线观看| 欧美日韩国产页| 色综合色综合色综合色综合| 国产另类在线| y97精品国产97久久久久久| 99精品在线播放| 国产毛片精品国产一区二区三区| 日韩福利一区二区三区| 黄页网站大全在线免费观看| 欧美系列日韩一区| 中文字幕人妻一区二区三区| 性xxxx欧美老肥妇牲乱| 国产精品高潮呻吟久久av野狼 | 欧美一区二区三区在线播放 | 粉嫩av一区二区夜夜嗨| 国产精品午夜春色av| 精品欧美一区免费观看α√| 久久久久久久久久久久电影| 色噜噜国产精品视频一区二区| 毛片视频网站在线观看| 处破女av一区二区| 99久久久无码国产精品性色戒| 免费看av不卡| 日韩av中文字幕在线免费观看| wwwav国产| 久久99精品一区二区三区三区| 日韩aⅴ视频一区二区三区| 97超碰免费在线| 精品国产成人系列| 麻豆国产尤物av尤物在线观看| 蜜桃视频一区二区三区在线观看| 日本三级中国三级99人妇网站 | 国产精品久久久久高潮| 视频二区在线| 红桃视频成人在线观看| 最新日本中文字幕| 欧美私人啪啪vps| 国产专区精品视频| av在线电影网| 欧美日韩美少妇| 欧美aaa级片| 欧美一级一区| 欧美激情第六页| 另类图片综合电影| 国产香蕉精品视频一区二区三区| 黄色av网站免费观看| 久久久精品一品道一区| 国产免费人做人爱午夜视频| 天海翼精品一区二区三区| 欧美又大又硬又粗bbbbb| 色播色播色播色播色播在线| 欧美日韩一区二区三区| 成人手机在线免费视频| 麻豆亚洲精品| 亚洲精品视频一区二区三区| 成人在线黄色| 精品国产一区二区三区久久久| 国产精品国产三级国产普通话对白| 一区二区中文视频| 中文字幕一区二区在线观看视频 | 伊人网站在线观看| 亚洲欧美在线视频| 超碰人人cao| 亚洲美女毛片| 欧洲精品在线一区| 本网站久久精品| 久久亚洲影音av资源网| 精品国产免费无码久久久| 亚洲一区二区欧美日韩 | 国产精品一区二区av白丝下载| 亚洲色图.com| 中文字幕在线播放视频| 日韩中文欧美在线| 天天爱天天做天天操| 51社区在线成人免费视频| 国产91精品久久久久| 番号集在线观看| 欧美一区二区精美| 成人毛片在线播放| 成人欧美一区二区三区小说| 一级黄色大片免费看| 国产精品嫩草99av在线| 亚洲欧美日韩精品久久久| 综合中文字幕| 国产成人极品视频| 18加网站在线| 亚洲欧洲日产国产网站| 国产成人精品毛片| 色就色 综合激情| 男人操女人的视频网站| 久久综合久久99| 992tv人人草| 模特精品在线| www.激情网| 不卡中文字幕| 国产视频精品网| 日韩深夜福利网站| 日韩av高清不卡| 欧美精品videossex少妇| 亚洲天堂成人在线视频| 亚洲国产精品suv| 欧美午夜一区二区三区免费大片| 日韩精品视频播放| **性色生活片久久毛片| 欧美图片第一页| 成人天堂资源www在线| 五月婷婷之综合激情| 日韩视频中文| 韩国无码av片在线观看网站| 成人aaaa| 欧美国产二区| 日韩在线影视| 国产偷久久久精品专区| 高清在线一区二区| 国产福利精品视频| 亚洲精品**中文毛片| 久久露脸国产精品| 性欧美videos高清hd4k| 色婷婷av一区二区三区久久| 你懂的在线视频| 亚洲第一色在线| 亚洲国产精品18久久久久久| 欧美精品色综合| 曰批又黄又爽免费视频| 91久久精品日日躁夜夜躁欧美| 日本熟女一区二区| 一区二区日韩电影| 国产精品丝袜一区二区| 国产精品女主播在线观看| 99久久久无码国产精品性| 播五月开心婷婷综合| 好吊操视频这里只有精品| 狠狠色伊人亚洲综合成人| 日本激情综合网| 免费人成精品欧美精品| 亚洲成色www.777999| 美女黄网久久| 日本爱爱免费视频| 视频在线在亚洲| 人人爽人人av| 日韩高清在线电影| 国产精品人人爽人人爽| 日韩av在线发布| 天天干天天干天天干天天干天天干| 老司机精品视频网站| 亚洲性生活网站| 热久久久久久久| 在线看的黄色网址| 狠狠色丁香婷婷综合| 国产无遮挡猛进猛出免费软件| 麻豆成人在线观看| 国产美女18xxxx免费视频| 久久99久久久久| 成人三级做爰av| 风间由美性色一区二区三区 | 欧美国产欧美综合| 成人无码精品1区2区3区免费看| 国产精品久久久久久久久免费相片| 大吊一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 美国黄色小视频| 午夜精品久久一牛影视| 久久国产视频精品| 欧美久久久久久久久久| jlzzjlzzjlzz亚洲人| 欧美r级电影在线观看| 日本亚洲欧美| 在线精品国产成人综合| 国产激情视频在线观看| 欧美激情二区三区| 东京一区二区| 国产欧美日韩免费| 2023国产精华国产精品| 茄子视频成人在线观看 | 91在线免费播放| 国产精品美女高潮无套| 亚洲人成影院在线观看| 日韩少妇裸体做爰视频| 欧美日韩一区二区在线观看| 国产免费久久久| 日韩精品一区二区三区第95| 丝袜美腿美女被狂躁在线观看| 欧美精品在线网站| 中文字幕色婷婷在线视频 | 亚洲欧洲国产精品一区| 九九九九九九精品| 久久免费大视频| 妞干网在线视频观看| 毛片一区二区三区| 亚洲啪av永久无码精品放毛片| 国产欧美日韩三级| 久久精品美女视频| 欧美三级在线视频| 日本高清视频网站| 久久精品美女视频网站| 中文字幕一区久| 成人av片网址| 日本精品黄色| 久久国产亚洲精品无码| 国内精品国产三级国产a久久| 国产精品无码午夜福利| 亚洲色图在线视频| 日韩黄色一级视频| 欧美不卡一区二区| 91av资源在线| 热re91久久精品国99热蜜臀| 日韩激情精品| 亚洲图片都市激情| 裸体一区二区| 亚洲香蕉中文网| 亚洲激情图片小说视频| 在线视频你懂得| 亚洲视频专区在线| 国产精品25p| 91精品国产高清久久久久久91裸体| 国产亚洲欧美日韩在线观看一区二区| 久久精品xxx| 国产精品77777竹菊影视小说| 黄色三级生活片| 无码av中文一区二区三区桃花岛| 99热这里精品| xxxxx91麻豆| 国产精品久久久久77777丨| 免费国产在线精品一区二区三区| 狠狠干综合网| 日韩av成人网| 一区二区三区高清不卡| 国产又粗又猛又黄又爽| 国产亚洲人成a一在线v站| 天堂电影一区| 久久久婷婷一区二区三区不卡| 亚洲天堂偷拍| 天天躁日日躁狠狠躁免费麻豆| 亚洲卡通欧美制服中文| 国产日韩欧美视频在线观看| 日韩中文字幕在线播放| 久久精品国产福利| 亚洲欧洲精品在线观看| 麻豆国产精品777777在线| 69xxx免费| 欧美色老头old∨ideo| av亚洲在线| 91精品久久久久久| 国产精品久久久久久影院8一贰佰| 国内外成人免费在线视频| 国产精品高潮久久久久无| 一本色道久久综合无码人妻| www.日韩不卡电影av| 韩国三级成人在线| 黄色成人在线免费观看| 成人av在线网站| 久久免费激情视频| 国产亚洲欧美日韩一区二区| 成人午夜sm精品久久久久久久| 亚洲bbw性色大片| 紧缚奴在线一区二区三区| 澳门黄色一级片| 精品国产免费人成电影在线观看四季| gogo高清在线播放免费| 麻豆久久久9性大片| 日本特黄久久久高潮| 天天做夜夜爱爱爱| 精品国产免费一区二区三区香蕉 | 久久免费av| www.偷拍.com| 黄色成人在线播放| yourporn在线观看中文站| 成人国产在线视频| 国模 一区 二区 三区| 噜噜噜在线视频| 欧美视频中文字幕| 羞羞污视频在线观看| 久久99精品久久久久久久青青日本| 天堂午夜影视日韩欧美一区二区| 丁香六月激情综合| 日韩精品一区二| 欧美人与性动交xxⅹxx| 在线一区日本视频| 成人av网址在线观看| 天天干天天操天天操| 久久亚洲精品小早川怜子66| 全球av集中精品导航福利| a在线观看免费视频| 亚洲一级在线观看| 国产九色在线| 91久久极品少妇xxxxⅹ软件| 国产精品美女久久久| 欧洲美女女同性互添| 日韩精品免费视频| 国产电影一区| 国产一级不卡毛片| 亚洲一区二区四区蜜桃| 成人在线免费观看|