日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 系統(tǒng) > Android > 正文

Android中AsyncTask的入門使用學(xué)習(xí)指南

2019-10-21 21:25:22
字體:
供稿:網(wǎng)友

前言

AsyncTask異步任務(wù),用于執(zhí)行耗時(shí)任務(wù)并在UI線程中更新結(jié)果。

我們都知道,Android UI線程中不能執(zhí)行耗時(shí)的任務(wù),否則就會(huì)出現(xiàn)ANR。對(duì)于耗時(shí)的操作就需要放到子線程中操作,操作完成后需要通知UI線程進(jìn)行更新等操作,這就需要Android的異步消息機(jī)制(創(chuàng)建一個(gè)Message對(duì)象,使用Handler發(fā)送出去,然后在Handler的handleMessage()方法中獲得剛才發(fā)送的Message對(duì)象,然后在這里進(jìn)行UI操作)。

不過本文要說的是AsyncTask,其實(shí)早在Android 1.5版本就引入這個(gè)類,所以我知道大多數(shù)人對(duì)它的用法都已經(jīng)非常熟悉了。基本用法在網(wǎng)上搜搜就有很多教程,然而,在使用時(shí),仍需要注意其潛在的問題以及缺陷。

[TOC]

AsyncTask 簡(jiǎn)單使用

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "MainActivity"; private ProgressDialog mDialog; private AsyncTask mAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  mDialog = new ProgressDialog(this);  mDialog.setMax(100);  mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  mDialog.setCancelable(false);  mAsyncTask = new MyAsyncTask();  findViewById(R.id.tv).setOnClickListener(this); } @Override public void onClick(View view) {  mAsyncTask.execute(); } private class MyAsyncTask extends AsyncTask<Void, Integer, Void> {  @Override  protected void onPreExecute() {   mDialog.show();   Log.e(TAG, Thread.currentThread().getName() + " onPreExecute ");  }  @Override  protected Void doInBackground(Void... params) {   // 模擬數(shù)據(jù)的加載,耗時(shí)的任務(wù)   for (int i = 0; i < 100; i++) {    try {     Thread.sleep(80);    } catch (InterruptedException e) {     e.printStackTrace();    }    publishProgress(i);   }   Log.e(TAG, Thread.currentThread().getName() + " doInBackground ");   return null;  }  @Override  protected void onProgressUpdate(Integer... values) {   mDialog.setProgress(values[0]);   Log.e(TAG, Thread.currentThread().getName() + " onProgressUpdate ");  }  @Override  protected void onPostExecute(Void result) {   // 進(jìn)行數(shù)據(jù)加載完成后的UI操作   mDialog.dismiss();   Log.e(TAG, Thread.currentThread().getName() + " onPostExecute ");  } }}

如以上實(shí)例中,當(dāng)UI線程中需求處理耗時(shí)的操作時(shí),我們可以放在AsyncTask的doInBackground方法中執(zhí)行,這個(gè)抽象的類,有幾個(gè)方法需要我們重新,除了doInBackground,我們可以在onPreExecute中為這個(gè)耗時(shí)方法進(jìn)行一些預(yù)處理操作,同時(shí)我們?cè)趏nPostExecute中對(duì)UI進(jìn)行更新操作。實(shí)例中的publishProgress對(duì)應(yīng)的回調(diào)是onProgressUpdate,這樣可以實(shí)時(shí)更新UI,提供更好的用戶體驗(yàn)。

AsyncTask 原理

AsyncTask主要有二個(gè)部分:一個(gè)是與主線的交互,另一個(gè)就是線程的管理調(diào)度。雖然可能多個(gè)AsyncTask的子類的實(shí)例,但是AsyncTask的內(nèi)部Handler和ThreadPoolExecutor都是進(jìn)程范圍內(nèi)共享的,其都是static的,也即屬于類的,類的屬性的作用范圍是CLASSPATH,因?yàn)橐粋€(gè)進(jìn)程一個(gè)VM,所以是AsyncTask控制著進(jìn)程范圍內(nèi)所有的子類實(shí)例。

1、與主線程交互

與主線程交互是通過Handler來進(jìn)行的,因?yàn)楸疚闹饕接慉syncTask在任務(wù)調(diào)度方面的,所以對(duì)于這部分不做細(xì)致介紹,感興趣的朋友可以繼續(xù)去看AsyncTask的源碼部分。

2、線程任務(wù)的調(diào)度

內(nèi)部會(huì)創(chuàng)建一個(gè)進(jìn)程作用域的線程池來管理要運(yùn)行的任務(wù),也就就是說當(dāng)你調(diào)用了AsyncTask#execute()后,AsyncTask會(huì)把任務(wù)交給線程池,由線程池來管理創(chuàng)建Thread和運(yùn)行Therad。對(duì)于內(nèi)部的線程池不同版本的Android的實(shí)現(xiàn)方式是不一樣的:

AsyncTask 發(fā)展

接下來我們先簡(jiǎn)單的了解一下AsyncTask的歷史

首先在android 3.0之前的版本,ThreadPool的限制是5個(gè),線程的并發(fā)量是128個(gè),阻塞隊(duì)列長(zhǎng)度10,也就是說超過138個(gè)則會(huì)拋出異常。因此我們?cè)谑褂玫臅r(shí)候,一定要主要這部分限制,正確的使用。

到了在Android 3.0之后的,也許是Google也意識(shí)到這個(gè)問題,對(duì)AsyncTask的API做了調(diào)整:

· execute()提交的任務(wù),按先后順序每次只運(yùn)行一個(gè)也就是說它是按提交的次序,每次只啟動(dòng)一個(gè)線程執(zhí)行一個(gè)任務(wù),完成之后再執(zhí)行第二個(gè)任務(wù),也就是相當(dāng)于只有一個(gè)后臺(tái)線程在執(zhí)行所提交的任務(wù)(Executors.newSingleThreadPool() )。

· 新增了接口executeOnExecutor()這個(gè)接口允許開發(fā)者提供自定義的線程池來運(yùn)行和調(diào)度Thread,如果你想讓所有的任務(wù)都能并發(fā)同時(shí)運(yùn)行,那就創(chuàng)建一個(gè)沒有限制的線程池(Executors.newCachedThreadPool() ),并提供給AsyncTask。這樣這個(gè)AsyncTask實(shí)例就有了自己的線程池而不必使用AsyncTask默認(rèn)的。

· 新增了二個(gè)預(yù)定義的線程池SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR。其實(shí)THREAD_POOL_EXECUTOR并不是新增的,之前的就有,只不過之前(Android 2.3)它是AsyncTask私有的,未公開而已。THREAD_POOL_EXECUTOR是一個(gè)corePoolSize為5的線程池,也就是說最多只有5個(gè)線程同時(shí)運(yùn)行,超過5個(gè)的就要等待。所以如果使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)就跟2.3版本的AsyncTask.execute()效果是一樣的。而SERIAL_EXECUTOR是新增的,它的作用是保證任務(wù)執(zhí)行的順序,也就是它可以保證提交的任務(wù)確實(shí)是按照先后順序執(zhí)行的。它的內(nèi)部有一個(gè)隊(duì)列用來保存所提交的任務(wù),保證當(dāng)前只運(yùn)行一個(gè),這樣就可以保證任務(wù)是完全按照順序執(zhí)行的,默認(rèn)的execute()使用的就是這個(gè),也就是executeOnExecutor(AsyncTask.SERIAL_EXECUTOR)與execute()是一樣的。

AsyncTask 源碼簡(jiǎn)析

這里我們從AsyncTask的起點(diǎn)開始分析,主要有 execute() 、executeOnExecutor() 。

public final AsyncTask<Params, Progress, Result> execute(Params... params) {   return executeOnExecutor(sDefaultExecutor, params); } public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,    Params... params) {   if (mStatus != Status.PENDING) {    switch (mStatus) {     case RUNNING:      throw new IllegalStateException("Cannot execute task:"        + " the task is already running.");     case FINISHED:      throw new IllegalStateException("Cannot execute task:"        + " the task has already been executed "        + "(a task can be executed only once)");    }   }    mStatus = Status.RUNNING;    onPreExecute();    mWorker.mParams = params;   exec.execute(mFuture);    return this;  } 
  1. 從代碼中可以看出,execute()其實(shí)也是通過執(zhí)行executeOnExecutor()方法,只是將其中的Executor設(shè)置為默認(rèn)值。
  2. executeOnExecutor()中將當(dāng)前AsyncTask的狀態(tài)為RUNNING,上面的switch也可以看出,每個(gè)異步任務(wù)在完成前只能執(zhí)行一次。
  3. 接下來就執(zhí)行了onPreExecute() ,當(dāng)前依然在UI線程,所以我們可以在其中做一些準(zhǔn)備工作。
  4. 將我們傳入的參數(shù)賦值給了mWorker.mParams
  5. 最后exec.execute(mFuture)

相信大家對(duì)代碼中出現(xiàn)的mWorker,以及mFuture都會(huì)有些困惑。接下來我們來看看mWorker找到這個(gè)類:

private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {   Params[] mParams; } 

可以看到是Callable的子類,且包含一個(gè)mParams用于保存我們傳入的參數(shù),下面看初始化mWorker的代碼:

  public AsyncTask() {   mWorker = new WorkerRunnable<Params, Result>() {    public Result call() throws Exception {     mTaskInvoked.set(true);      Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);     //noinspection unchecked     return postResult(doInBackground(mParams));    }   };  //... } 

可以看到mWorker在構(gòu)造方法中完成了初始化,并且因?yàn)槭且粋€(gè)抽象類,在這里new了一個(gè)實(shí)現(xiàn)類,實(shí)現(xiàn)了call方法,call方法中設(shè)置mTaskInvoked=true,且最終調(diào)用doInBackground(mParams)方法,并返回Result值作為參數(shù)給postResult方法.可以看到我們的doInBackground出現(xiàn)了,下面繼續(xù)看:

private Result postResult(Result result) {   @SuppressWarnings("unchecked")   Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT,     new AsyncTaskResult<Result>(this, result));   message.sendToTarget();   return result; } 

可以看到postResult中出現(xiàn)了我們熟悉的異步消息機(jī)制,傳遞了一個(gè)消息message, message.what為MESSAGE_POST_RESULT;message.object= new AsyncTaskResult(this,result);

private static class AsyncTaskResult<Data> {   final AsyncTask mTask;   final Data[] mData;    AsyncTaskResult(AsyncTask task, Data... data) {    mTask = task;    mData = data;   }  } 

AsyncTaskResult就是一個(gè)簡(jiǎn)單的攜帶參數(shù)的對(duì)象。

看到這,我相信大家肯定會(huì)想到,在某處肯定存在一個(gè)sHandler,且復(fù)寫了其handleMessage方法等待消息的傳入,以及消息的處理。

private static final InternalHandler sHandler = new InternalHandler();  private static class InternalHandler extends Handler {   @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})   @Override   public void handleMessage(Message msg) {    AsyncTaskResult result = (AsyncTaskResult) msg.obj;    switch (msg.what) {     case MESSAGE_POST_RESULT:      // There is only one result      result.mTask.finish(result.mData[0]);      break;     case MESSAGE_POST_PROGRESS:      result.mTask.onProgressUpdate(result.mData);      break;    }   } } 

這里出現(xiàn)了我們的handleMessage,可以看到,在接收到MESSAGE_POST_RESULT消息時(shí),執(zhí)行了result.mTask.finish(result.mData[0]);其實(shí)就是我們的AsyncTask.this.finish(result) ,于是看finish方法

private void finish(Result result) {   if (isCancelled()) {    onCancelled(result);   } else {    onPostExecute(result);   }   mStatus = Status.FINISHED;  } 

可以看到,如果我們調(diào)用了cancel()則執(zhí)行onCancelled回調(diào);正常執(zhí)行的情況下調(diào)用我們的onPostExecute(result);主要這里的調(diào)用是在handler的handleMessage中,所以是在UI線程中。最后將狀態(tài)置為FINISHED。

mWoker看完了,應(yīng)該到我們的mFuture了,依然實(shí)在構(gòu)造方法中完成mFuture的初始化,將mWorker作為參數(shù),復(fù)寫了其done方法。

public AsyncTask() {  ...   mFuture = new FutureTask<Result>(mWorker) {    @Override    protected void done() {     try {      postResultIfNotInvoked(get());     } catch (InterruptedException e) {      android.util.Log.w(LOG_TAG, e);     } catch (ExecutionException e) {      throw new RuntimeException("An error occured while executing doInBackground()",        e.getCause());     } catch (CancellationException e) {      postResultIfNotInvoked(null);     }    }   }; } 

任務(wù)執(zhí)行結(jié)束會(huì)調(diào)用:postResultIfNotInvoked(get());get()表示獲取mWorker的call的返回值,即Result.然后看postResultIfNotInvoked方法

private void postResultIfNotInvoked(Result result) {     final boolean wasTaskInvoked = mTaskInvoked.get();     if (!wasTaskInvoked) {       postResult(result);     } } 

如果mTaskInvoked不為true,則執(zhí)行postResult;但是在mWorker初始化時(shí)就已經(jīng)將mTaskInvoked為true,所以一般這個(gè)postResult執(zhí)行不到。好了,到了這里,已經(jīng)介紹完了execute方法中出現(xiàn)了mWorker和mFurture,不過這里一直是初始化這兩個(gè)對(duì)象的代碼,并沒有真正的執(zhí)行。下面我們看真正調(diào)用執(zhí)行的地方。execute方法中的:還記得上面的execute中的:exec.execute(mFuture)

exec為executeOnExecutor(sDefaultExecutor, params)中的sDefaultExecutor

下面看這個(gè)sDefaultExecutor

private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); private static class SerialExecutor implements Executor {   final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();   Runnable mActive;   public synchronized void execute(final Runnable r) {    mTasks.offer(new Runnable() {     public void run() {      try {       r.run();      } finally {       scheduleNext();      }     }    });    if (mActive == null) {     scheduleNext();    }   }   protected synchronized void scheduleNext() {    if ((mActive = mTasks.poll()) != null) {     THREAD_POOL_EXECUTOR.execute(mActive);    }   } } 

可以看到sDefaultExecutor其實(shí)為SerialExecutor的一個(gè)實(shí)例,其內(nèi)部維持一個(gè)任務(wù)隊(duì)列;直接看其execute(Runnable runnable)方法,將runnable放入mTasks隊(duì)尾;再判斷當(dāng)前mActive是否為空,為空則調(diào)用scheduleNext。方法scheduleNext,則直接取出任務(wù)隊(duì)列中的隊(duì)首任務(wù),如果不為null則傳入THREAD_POOL_EXECUTOR進(jìn)行執(zhí)行。下面看THREAD_POOL_EXECUTOR為何方神圣:

public static final Executor THREAD_POOL_EXECUTOR    =new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,      TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); 

可以看到就是一個(gè)自己設(shè)置參數(shù)的線程池,參數(shù)為:

private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 1; private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) {   return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());  }  }; private static final BlockingQueue<Runnable> sPoolWorkQueue =    new LinkedBlockingQueue<Runnable>(10); 

看到這里,大家可能會(huì)認(rèn)為,背后原來有一個(gè)線程池,且最大支持128的線程并發(fā),加上長(zhǎng)度為10的阻塞隊(duì)列,可能會(huì)覺得就是在快速調(diào)用138個(gè)以內(nèi)的AsyncTask子類的execute方法不會(huì)出現(xiàn)問題,而大于138則會(huì)拋出異常。其實(shí)不是這樣的,我們?cè)僮屑?xì)看一下代碼,回顧一下sDefaultExecutor,真正在execute()中調(diào)用的為sDefaultExecutor.execute

private static class SerialExecutor implements Executor {   final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();   Runnable mActive;   public synchronized void execute(final Runnable r) {    mTasks.offer(new Runnable() {     public void run() {      try {       r.run();      } finally {       scheduleNext();      }     }    });    if (mActive == null) {     scheduleNext();    }   }   protected synchronized void scheduleNext() {    if ((mActive = mTasks.poll()) != null) {     THREAD_POOL_EXECUTOR.execute(mActive);    }   } } 

可以看到,如果此時(shí)有10個(gè)任務(wù)同時(shí)調(diào)用execute(s synchronized)方法,第一個(gè)任務(wù)入隊(duì),然后在mActive = mTasks.poll()) != null被取出,并且賦值給mActivte,然后交給線程池去執(zhí)行。然后第二個(gè)任務(wù)入隊(duì),但是此時(shí)mActive并不為null,并不會(huì)執(zhí)行scheduleNext();所以如果第一個(gè)任務(wù)比較慢,10個(gè)任務(wù)都會(huì)進(jìn)入隊(duì)列等待;真正執(zhí)行下一個(gè)任務(wù)的時(shí)機(jī)是,線程池執(zhí)行完成第一個(gè)任務(wù)以后,調(diào)用Runnable中的finally代碼塊中的scheduleNext,所以雖然內(nèi)部有一個(gè)線程池,其實(shí)調(diào)用的過程還是線性的。一個(gè)接著一個(gè)的執(zhí)行,相當(dāng)于單線程。

總結(jié):

AsyncTask在并發(fā)執(zhí)行多個(gè)任務(wù)時(shí)發(fā)生異常。其實(shí)還是存在的,在3.0以前的系統(tǒng)中還是會(huì)以支持多線程并發(fā)的方式執(zhí)行,支持并發(fā)數(shù)也是我們上面所計(jì)算的128,阻塞隊(duì)列可以存放10個(gè);也就是同時(shí)執(zhí)行138個(gè)任務(wù)是沒有問題的;而超過138會(huì)馬上出現(xiàn)java.util.concurrent.RejectedExecutionException;而在在3.0以上包括3.0的系統(tǒng)中會(huì)為單線程執(zhí)行(即我們上面代碼的分析)

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产一区在线观看视频| 日韩在线视频免费观看| 欧美人妻一区二区三区| 日韩精品在线网站| 亚欧成人精品| 日韩视频一区在线观看| 日韩精品不卡一区二区| 国产激情三区| 国产婷婷一区二区| 国产又粗又猛又爽又黄91精品| 欧美日韩一级黄| 欧美日韩一级视频| 亚洲欧美中文在线视频| 精品一二线国产| 日韩一二三四区| 国产乱码在线观看| 黄色片免费在线| 深夜福利亚洲| 日韩www在线| 99久久久精品免费观看国产| 欧美日韩视频在线| 欧美高清一级片在线| 深夜福利一区二区| 午夜少妇久久久久久久久| 国产免费永久在线观看| 精品中文字幕在线播放| 日韩一级精品| 日韩中文字幕亚洲| 二区三区不卡不卡视频| 亚洲国产欧美久久| 国产黄在线观看| 日韩精品视频中文在线观看| 91精品在线观看入口| 欧美一级久久久久久久久大| 日韩区欧美区| 亚洲中文字幕在线一区| 精品一二三四| 91精品国产91久久久久久久久| 国产香蕉精品视频| 久久婷婷国产| 国产丝袜在线播放| 日韩精品大片| 中文字幕欧美亚洲| 精品国产99久久久久久| 日韩中文字幕视频在线| 欧美日韩一级黄| 欧美不卡视频| 中文字幕4区| 亚洲欧洲三级| 国产婷婷一区二区| 欧美日韩在线播放三区四区| 99精品人妻国产毛片| 91精品国产日韩91久久久久久| 精品极品三级久久久久| av中文在线播放| 欧美日韩国产一级片| 国产亚洲视频中文字幕视频| 男人的天堂网av| 色综合天天综合网国产成人综合天| 欧美日韩在线观看成人| 久久精品99久久久久久久久| 国产成人精品免费在线| 国产在线日韩精品| 精品999视频| 国产视频1区| 中文字幕国产欧美| 天天在线视频色| 国产手机视频一区二区| 在线观看免费国产小视频| 国产日韩av高清| 久久久久久91| 日本中文字幕在线观看| xxxxx性| 国产成人精品网址| 国产成人精品综合久久久| 91精品国产乱码久久蜜臀| 欧美啪啪一区| 91精品免费在线观看| 国产日韩精品在线观看| 国产一区免费视频| 精品午夜av| 欧美日韩精品久久久| 日韩av综合在线观看| 欧美日韩中文另类| 国产95在线|亚洲| 日韩欧美在线网址| 国产 欧美 在线| 亚洲综合在线电影| www.中文字幕在线| 在线观看国产福利视频| 亚洲成在线观看| 最近中文字幕第一页| 日韩美女视频一区二区在线观看| 欧美日韩视频在线| 久久久精品网| 欧美日韩中文另类| 欧美日韩激情在线一区二区三区| 亚洲第一精品在线| 中文字幕伊人| 精品国产乱码一区二区| 久久99久久久欧美国产| 久久99蜜桃精品久久久久小说| 在线欧美日韩精品| 国产黄色一级片| 91精品在线观| 国产综合成人久久大片91| 黄色视屏免费在线观看| 国产福利精品导航| 日本亚洲视频在线| 日韩亚洲一区在线| 国产福利免费观看| 国产在线精品日韩| 久久99久久久久| 日韩 欧美 亚洲| 日韩欧美在线影院| 精品日韩一区二区三区免费视频| 国产aa精品| 国产最顶级的黄色片在线免费观看| 国产日韩精品在线观看| 黄色资源在线观看| 黄色片免费看| 影音先锋中文字幕在线观看| 精品久久久三级| 91精品国产91久久| 欧美日韩国产片| 国产欧美在线观看| 国产在线一区二区视频| 91欧美在线视频| 国产日韩1区| 日韩av在线中文字幕| 欧美国产一级片| 影音先锋一区二区资源站| 91一区二区| 91久久精品午夜一区二区| 国产亚洲人成a一在线v站| 午夜影院在线观看欧美| 日韩精品视频免费看| 91久久视频| 91精品国产综合久久久久久| 国产一级在线播放| 久久久精品日韩| 欧美日韩综合在线| 国产激情99| 亚洲免费观看视频| 亚洲一区不卡在线| 伊人亚洲视频| 久久夜色精品国产欧美乱极品| 精品中文字幕在线播放| 中文字幕精品在线| 日本精品在线播放| 国产网站av| 欧美中文字幕在线观看视频| 国产劲爆久久| 国产在线www| 欧美日韩在线观看一区| 在线观看一区日韩| 一区二区三区视频网站| 日韩视频第二页| 欧美日韩人人澡狠狠躁视频| 国产小视频在线| 欧美中文字幕在线| 一本一道综合狠狠老| 日韩高清在线不卡| 午夜av一区| 蜜桃视频一日韩欧美专区| 欧美日韩国产首页在线观看| 中文字幕视频在线免费欧美日韩综合在线看 | 在线中文免费视频| 日韩在线观看a| 日韩在线视频免费观看| 欧美日韩国产123区| 国产亚洲欧美色| 日韩精品视频在线免费观看| av手机天堂| 亚洲理论中文字幕| 成人xxxx| 国产永久在线观看| 欧美日韩不卡在线视频| 亚洲二区自拍| 日韩在线不卡一区| 99中文字幕一区| 欧美在线观看视频一区| wwww亚洲| 日韩在线a电影| 欧美一级久久| 欧美日韩高清在线播放| 日韩国产欧美亚洲| 中文在线中文字幕| 久久蜜桃一区二区| 日韩 国产 一区| 搞黄在线观看| 欧美日韩国产在线| 国产午夜在线观看| 久久99久久久久| 欧美高清视频一区二区三区| 国产中文在线| 国产一二三精品| 精品人妻一区二区三区视频| 欧美1区免费| 国产欧美日韩综合精品| 欧美日韩国产观看视频| 欧美日韩国产系列| 精品999视频| 国产成人精品日本亚洲专区61| 国产视频二区| 91精品国产亚洲| 日韩中文欧美在线| 国产区日韩欧美| 亚洲黄色在线观看| 国产黄色在线看| 日韩在线视频网| 日本免费在线视频不卡一不卡二| 欧美日韩亚洲91| 国产日韩综合| 国产中文伊人| 日韩久久精品视频| 日韩美女中文字幕| 欧美日韩久久久| 日韩三级精品电影久久久| 欧美日韩高清在线一区| 欧美日韩中文字幕在线| 国产婷婷精品| 91色在线看| a视频在线播放| 日韩中文在线字幕| 欧美日韩在线观看一区| 亚洲v中文字幕| 国产三级免费观看| 国产黄色在线观看| 欧美xxxx中国| 一区免费在线| 欧美日韩亚州综合| 国产欧美日韩在线| 欧美一级搡bbbb搡bbbb| 欧美日韩国产高清一区| 欧美日韩国产免费| 欧美中文字幕视频在线观看| 91精品国产91| 日韩 国产 一区| 国产三级免费观看| 欧美日韩一二| 欧美日韩精品欧美日韩精品一| 久久中文精品| 亚洲第一精品在线| 精品中文字幕在线播放| 1区2区3区在线视频| 中文字幕日韩高清| 精品熟女一区二区三区| 国产福利三区| 亚洲欧美中文字幕| 欧美日韩精品综合| 亚洲午夜91| 亚洲一区在线观看视频| 日韩 欧美 中文| 日韩中文字幕视频网| 午夜av一区二区| av中文资源在线| 亚洲 欧美综合在线网络| 欧美日韩精品三区| 天天综合天天| 欧美在线日韩精品| 高清日韩中文字幕| 中文字幕五月天| 亚洲免费观看视频| 日韩欧美在线中字| 国产小视频在线观看免费| 久久人人88| 国产免费不卡av| 欧美性生交大片免费| 二区中文字幕| 国产欧美综合视频| www.中文字幕在线| 欧美日韩午夜在线| 中文字幕国产在线| 欧美熟妇乱码在线一区| 欧美高清一级片在线| av高清一区| 日韩一级免费视频| 亚洲视频在线观看日本a| 日韩欧美在线视频日韩欧美在线视频| 中文字幕在线看精品乱码| 久99久视频| 欧美日韩国产首页| 午夜一区二区三区视频 | 国产日韩亚洲欧美| 欧美日韩中文在线| 日韩视频一区| 亚洲图片小说综合| 国产三级视频网站| 日韩欧美亚洲视频| 91精品国产色综合久久久蜜香臀| 日韩三级高清在线| 激情婷婷亚洲| 日韩免费精品| 精品视频123区在线观看| 亚洲欧洲日韩精品在线| 婷婷综合福利| 日韩精品在线第一页| 亚洲三级av| 狠狠色噜噜狠狠狠狠97| 一二三区精品视频| 午夜影院在线观看欧美| 亚洲高清在线观看一区| 久久精品99久久久久久久久 | 91精品国产自产91精品| 91蜜桃婷婷狠狠久久综合9色| 欧美亚洲专区| 亚洲一区精品在线| a视频免费在线观看| 欧美日韩乱国产| 在线国产三级| 久久久精品国产99久久精品芒果| 中文字幕久精品免费视频| 黄色一区二区在线| 国产乱国产乱老熟300部视频| 91欧美日韩麻豆精品| 亚洲欧美久久久| 一区二区三区精品在线观看| 国产福利一区二区| 91精品国产综合久久香蕉的特点 | 国产欧美 在线欧美| 天堂精品高清1区2区3区| 亚洲第一页中文字幕| 欧美日韩国产三级| 欧美高清一区| 国产最顶级的黄色片在线免费观看| www.狠狠| 国产欧美中文在线| 精品一性一色一乱农村| 国产成人精品日本亚洲专区61| 国产无遮挡在线视频免费观看| 国产欧美日韩精品在线| 视频一区二区国产| 国产黄色在线播放| 91精品国产综合久久香蕉的特点 | 日韩精品一二三四区| 中文字幕 亚洲一区| 亚洲一区精品在线| 日本a口亚洲| 久久精品蜜桃| 欧美日韩在线不卡视频| 日韩精品在线私人| 日韩精品不卡一区二区| 免费看黄资源大全高清| 日韩在线观看精品| 日韩av综合在线观看| 91精品国产综合久久香蕉的特点| 亚洲永久字幕| 午夜亚洲一区| av手机天堂| 福利在线国产| 日本国产在线视频| 精品熟女一区二区三区| 亚洲中文字幕一区| av一级在线| 国产中文伊人| 亚洲小说春色综合另类电影| √新版天堂资源在线资源| 中文字幕在线观看播放| 国产黄色片中文字幕| 91精品国产自产在线观看永久∴| 国产免费电影网站入口| 99中文字幕一区| 日韩欧美一级精品久久| 国产综合成人久久大片91| 欧美日韩国产在线看| 久久夜色精品国产噜噜亚洲av| 国产在线不卡av| 天堂中文在线视频| 日韩精品在线观| 日韩一级免费在线观看| 欧美日本精品在线| 亚洲一区资源| 欧美日韩精品在线| 成人xxxx| 欧美日韩国产综合视频在线观看 | 日韩欧美中文字幕精品| 精品久久久视频| 国自产拍在线网站网址视频| 视频一区二区国产| 日韩中文字幕视频在线观看| 欧美日韩亚洲国内综合网俺| 中文字幕在线亚洲| 日韩亚洲一区中文字幕| 中文字幕精品在线视频| 日韩免费视频一区二区视频在线观看| 国产成人精品综合网站| 久久久久久99精品| 最近中文字幕在线中文高清版| 久久99久久久欧美国产| 在线观看国产一级片| 精品久久久精品| 99精品电影| 欧美1234区| 91精品国产综合久久久久 | 日韩视频在线一区二区| 日韩在线不卡一区| 日韩在线视频免费观看| 日韩精品在线免费观看视频| 亚洲第一视频|