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

一套完善的Android異步任務(wù)類

移動開發(fā) Android
今天向大家介紹一個很有用的異步任務(wù)類處理類,分別包含了AsyncTask各個環(huán)節(jié)中的異常處理、大量并發(fā)執(zhí)行而不發(fā)生異常、字符串?dāng)?shù)據(jù)緩存等功能。并且感謝@馬天宇(http://litesuits.com/)給我的思路與指點。

[[123542]]

今天向大家介紹一個很有用的異步任務(wù)類處理類,分別包含了AsyncTask各個環(huán)節(jié)中的異常處理、大量并發(fā)執(zhí)行而不發(fā)生異常、字符串?dāng)?shù)據(jù)緩存等功能。并且感謝@馬天宇(http://litesuits.com/)給我的思路與指點。

研究過Android系統(tǒng)源碼的同學(xué)會發(fā)現(xiàn):AsyncTask在android2.3的時候線程池是一個核心數(shù)為5線程,隊列可容納10線程,***執(zhí)行128個任務(wù),這存在一個問題,當(dāng)你真的有138個并發(fā)時,即使手機沒被你撐爆,那么超出這個指標(biāo)應(yīng)用絕對crash掉。 后來升級到3.0,為了避免并發(fā)帶來的一些列問題,AsyncTask竟然成為序列執(zhí)行器了,也就是你即使你同時execute N個AsyncTask,它也是挨個排隊執(zhí)行的。 這一點請同學(xué)們一定注意,AsyncTask在3.0以后,是異步的沒錯,但不是并發(fā)的。關(guān)于這一點的改進辦法,我之前寫過一篇《Thread并發(fā)請求封裝——深入理解AsyncTask類》沒有看過的同學(xué)可以看這里,本文是在這個基礎(chǔ)上對AsyncTask做進一步的優(yōu)化。

根據(jù)Android4.0源碼我們可以看到,在AsyncTask中默認(rèn)有兩個執(zhí)行器,ThreadPoolExecutor和SerialExecutor,分別表示并行執(zhí)行器和串行執(zhí)行器。但是默認(rèn)的并行執(zhí)行器并不能執(zhí)行大于128個任務(wù)的處理,所以我們在此定義一個根據(jù)lru調(diào)度策略的并行執(zhí)行器。源碼可以看這里。

  1. /** 
  2.     * 用于替換掉原生的mThreadPoolExecutor,可以大大改善Android自帶異步任務(wù)框架的處理能力和速度。 
  3.     * 默認(rèn)使用LIFO(后進先出)策略來調(diào)度線程,可將***的任務(wù)快速執(zhí)行,當(dāng)然你自己可以換為FIFO調(diào)度策略。 
  4.     * 這有助于用戶當(dāng)前任務(wù)優(yōu)先完成(比如加載圖片時,很容易做到當(dāng)前屏幕上的圖片優(yōu)先加載)。 
  5.     */ 
  6.    private static class SmartSerialExecutor implements Executor { 
  7.        /** 
  8.         * 這里使用{@link ArrayDequeCompat}作為棧比{@link Stack}性能高 
  9.         */ 
  10.        private ArrayDequeCompat<Runnable> mQueue = new ArrayDequeCompat<Runnable>( 
  11.                serialMaxCount); 
  12.        private ScheduleStrategy mStrategy = ScheduleStrategy.LIFO; 
  13.  
  14.        private enum ScheduleStrategy { 
  15.            LIFO, FIFO; 
  16.        } 
  17.  
  18.        /** 
  19.         * 一次同時并發(fā)的數(shù)量,根據(jù)處理器數(shù)量調(diào)節(jié) <br> 
  20.         * cpu count : 1 2 3 4 8 16 32 <br> 
  21.         * once(base*2): 1 2 3 4 8 16 32 <br> 
  22.         * 一個時間段內(nèi)最多并發(fā)線程個數(shù): 雙核手機:2 四核手機:4 ... 計算公式如下: 
  23.         */ 
  24.        private static int serialOneTime; 
  25.        /** 
  26.         * 并發(fā)***數(shù)量,當(dāng)投入的任務(wù)過多大于此值時,根據(jù)Lru規(guī)則,將最老的任務(wù)移除(將得不到執(zhí)行) <br> 
  27.         * cpu count : 1 2 3 4 8 16 32 <br> 
  28.         * base(cpu+3) : 4 5 6 7 11 19 35 <br> 
  29.         * max(base*16): 64 80 96 112 176 304 560 <br> 
  30.         */ 
  31.        private static int serialMaxCount; 
  32.  
  33.        private void reSettings(int cpuCount) { 
  34.            serialOneTime = cpuCount; 
  35.            serialMaxCount = (cpuCount + 3) * 16
  36.        } 
  37.        public SmartSerialExecutor() { 
  38.            reSettings(CPU_COUNT); 
  39.        } 
  40.        @Override 
  41.        public synchronized void execute(final Runnable command) { 
  42.            Runnable r = new Runnable() { 
  43.                @Override 
  44.                public void run() { 
  45.                    command.run(); 
  46.                    next(); 
  47.                } 
  48.            }; 
  49.            if ((mThreadPoolExecutor).getActiveCount() < serialOneTime) { 
  50.                // 小于單次并發(fā)量直接運行 
  51.                mThreadPoolExecutor.execute(r); 
  52.            } else { 
  53.                // 如果大于并發(fā)上限,那么移除最老的任務(wù) 
  54.                if (mQueue.size() >= serialMaxCount) { 
  55.                    mQueue.pollFirst(); 
  56.                } 
  57.                // 新任務(wù)放在隊尾 
  58.                mQueue.offerLast(r); 
  59.            } 
  60.        } 
  61.        public synchronized void next() { 
  62.            Runnable mActive; 
  63.            switch (mStrategy) { 
  64.            case LIFO: 
  65.                mActive = mQueue.pollLast(); 
  66.                break
  67.            case FIFO: 
  68.                mActive = mQueue.pollFirst(); 
  69.                break
  70.            default
  71.                mActive = mQueue.pollLast(); 
  72.                break
  73.            } 
  74.            if (mActive != null) { 
  75.                mThreadPoolExecutor.execute(mActive); 
  76.            } 
  77.        } 
  78.    } 

以上便是對AsyncTask的并發(fā)執(zhí)行優(yōu)化,接下來我們看對異常捕獲的改進。

真正說起來,這并不算是什么功能上的改進,僅僅是一種開發(fā)上的技巧。代碼過長,我刪去了一些,僅留下重要部分。

  1. /** 
  2.  * 安全異步任務(wù),可以捕獲任意異常,并反饋給給開發(fā)者。<br> 
  3.  * 從執(zhí)行前,執(zhí)行中,執(zhí)行后,乃至更新時的異常都捕獲。<br> 
  4.  */ 
  5. public abstract class SafeTask<Params, Progress, Result> extends 
  6.         KJTaskExecutor<Params, Progress, Result> { 
  7.     private Exception cause; 
  8.   
  9.     @Override 
  10.     protected final void onPreExecute() { 
  11.         try { 
  12.             onPreExecuteSafely(); 
  13.         } catch (Exception e) { 
  14.             exceptionLog(e); 
  15.         } 
  16.     } 
  17.     @Override 
  18.     protected final Result doInBackground(Params... params) { 
  19.         try { 
  20.             return doInBackgroundSafely(params); 
  21.         } catch (Exception e) { 
  22.             exceptionLog(e); 
  23.             cause = e; 
  24.         } 
  25.         return null
  26.     } 
  27.     @Override 
  28.     protected final void onProgressUpdate(Progress... values) { 
  29.         try { 
  30.             onProgressUpdateSafely(values); 
  31.         } catch (Exception e) { 
  32.             exceptionLog(e); 
  33.         } 
  34.     } 
  35.     @Override 
  36.     protected final void onPostExecute(Result result) { 
  37.         try { 
  38.             onPostExecuteSafely(result, cause); 
  39.         } catch (Exception e) { 
  40.             exceptionLog(e); 
  41.         } 
  42.     } 
  43.     @Override 
  44.     protected final void onCancelled(Result result) { 
  45.         onCancelled(result); 
  46.     } 

其實從代碼就可以看出,僅僅是對原AsyncTask類中各個階段的代碼做了一次try..catch... 但就是這一個小優(yōu)化,不僅可以使代碼整齊(我覺得try...catch太多真的很影響代碼美觀),而且在最終都可以由一個onPostExecuteSafely(xxx)來整合處理,使得結(jié)構(gòu)更加緊湊。

讓AsyncTask附帶數(shù)據(jù)緩存功能

我們在做APP開發(fā)的時候,網(wǎng)絡(luò)訪問都會加上緩存處理,其中的原因我想就不必講了。那么如果讓AsyncTask自身就附帶網(wǎng)絡(luò)JSON緩存,豈不是更好?其實實現(xiàn)原理很簡單,就是將平時我們寫在外面的緩存方法放到AsyncTask內(nèi)部去實現(xiàn),注釋已經(jīng)講解的很清楚了,這里就不再講了

  1. /** 
  2.  * 本類主要用于獲取網(wǎng)絡(luò)數(shù)據(jù),并將結(jié)果緩存至文件,文件名為key,緩存有效時間為value <br> 
  3.  * <b>注:</b>{@link #CachedTask#Result}需要序列化,否則不能或者不能完整的讀取緩存。<br> 
  4.  */ 
  5. public abstract class CachedTask<Params, Progress, Result extends Serializable> 
  6.         extends SafeTask<Params, Progress, Result> { 
  7.     private String cachePath = "folderName"// 緩存路徑 
  8.     private String cacheName = "MD5_effectiveTime"// 緩存文件名格式 
  9.     private long expiredTime = 0// 緩存時間 
  10.     private String key; // 緩存以鍵值對形式存在 
  11.     private ConcurrentHashMap<String, Long> cacheMap; 
  12.   
  13.     /** 
  14.      * 構(gòu)造方法 
  15.      * @param cachePath  緩存路徑 
  16.      * @param key  存儲的key值,若重復(fù)將覆蓋 
  17.      * @param cacheTime  緩存有效期,單位:分 
  18.      */ 
  19.     public CachedTask(String cachePath, String key, long cacheTime) { 
  20.         if (StringUtils.isEmpty(cachePath) 
  21.                 || StringUtils.isEmpty(key)) { 
  22.             throw new RuntimeException("cachePath or key is empty"); 
  23.         } else { 
  24.             this.cachePath = cachePath; 
  25.             // 對外url,對內(nèi)url的md5值(不僅可以防止由于url過長造成文件名錯誤,還能防止惡意修改緩存內(nèi)容) 
  26.             this.key = CipherUtils.md5(key); 
  27.             // 對外單位:分,對內(nèi)單位:毫秒 
  28.             this.expiredTime = TimeUnit.MILLISECONDS.convert( 
  29.                     cacheTime, TimeUnit.MINUTES); 
  30.             this.cacheName = this.key + "_" + cacheTime; 
  31.             initCacheMap(); 
  32.         } 
  33.     } 
  34.   
  35.     private void initCacheMap() { 
  36.         cacheMap = new ConcurrentHashMap<String, Long>(); 
  37.         File folder = FileUtils.getSaveFolder(cachePath); 
  38.         for (String name : folder.list()) { 
  39.             if (!StringUtils.isEmpty(name)) { 
  40.                 String[] nameFormat = name.split("_"); 
  41.                 // 若滿足命名格式則認(rèn)為是一個合格的cache 
  42.                 if (nameFormat.length == 2 && (nameFormat[0].length() == 32 || nameFormat[0].length() == 64 || nameFormat[0].length() == 128)) { 
  43.                     cacheMap.put(nameFormat[0], TimeUnit.MILLISECONDS.convert(StringUtils.toLong(nameFormat[1]), TimeUnit.MINUTES)); 
  44.                 } 
  45.             } 
  46.         } 
  47.     } 
  48.   
  49.     /** 
  50.      * 做聯(lián)網(wǎng)操作,本方法運行在線程中 
  51.      */ 
  52.     protected abstract Result doConnectNetwork(Params... params) 
  53.             throws Exception; 
  54.   
  55.     /** 
  56.      * 做耗時操作 
  57.      */ 
  58.     @Override 
  59.     protected final Result doInBackgroundSafely(Params... params) 
  60.             throws Exception { 
  61.         Result res = null
  62.         Long time = cacheMap.get(key); 
  63.         long lastTime = (time == null) ? 0 : time; // 獲取緩存有效時間 
  64.         long currentTime = System.currentTimeMillis(); // 獲取當(dāng)前時間 
  65.   
  66.         if (currentTime >= lastTime + expiredTime) { // 若緩存無效,聯(lián)網(wǎng)下載 
  67.             res = doConnectNetwork(params); 
  68.             if (res == null)  
  69.                 res = getResultFromCache(); 
  70.             else  
  71.                 saveCache(res); 
  72.         } else { // 緩存有效,使用緩存 
  73.             res = getResultFromCache(); 
  74.             if (res == null) { // 若緩存數(shù)據(jù)意外丟失,重新下載 
  75.                 res = doConnectNetwork(params); 
  76.                 saveCache(res); 
  77.             } 
  78.         } 
  79.         return res; 
  80.     } 
  81.   
  82.     private Result getResultFromCache() { 
  83.         Result res = null
  84.         ObjectInputStream ois = null
  85.         try { 
  86.             ois = new ObjectInputStream(new FileInputStream( 
  87.                     FileUtils.getSaveFile(cachePath, key))); 
  88.             res = (Result) ois.readObject(); 
  89.         } catch (Exception e) { 
  90.             e.printStackTrace(); 
  91.         } finally { 
  92.             FileUtils.closeIO(ois); 
  93.         } 
  94.         return res; 
  95.     } 
  96.   
  97.     /** 
  98.      * 保存數(shù)據(jù),并返回是否成功 
  99.      */ 
  100.     private boolean saveResultToCache(Result res) { 
  101.         boolean saveSuccess = false
  102.         ObjectOutputStream oos = null
  103.         try { 
  104.             oos = new ObjectOutputStream(new FileOutputStream( 
  105.                     FileUtils.getSaveFile(cachePath, key))); 
  106.             oos.writeObject(res); 
  107.             saveSuccess = true
  108.         } catch (Exception e) { 
  109.             e.printStackTrace(); 
  110.         } finally { 
  111.             FileUtils.closeIO(oos); 
  112.         } 
  113.         return saveSuccess; 
  114.     } 
  115.   
  116.     /** 
  117.      * 清空緩存文件(異步) 
  118.      */ 
  119.     public void cleanCacheFiles() { 
  120.         cacheMap.clear(); 
  121.         File file = FileUtils.getSaveFolder(cachePath); 
  122.         final File[] fileList = file.listFiles(); 
  123.         if (fileList != null) { 
  124.             // 異步刪除全部文件 
  125.             TaskExecutor.start(new Runnable() { 
  126.                 @Override 
  127.                 public void run() { 
  128.                     for (File f : fileList) { 
  129.                         if (f.isFile()) { 
  130.                             f.delete(); 
  131.                         } 
  132.                     } 
  133.                 }// end run() 
  134.             }); 
  135.         }// end if 
  136.     } 
  137.   
  138.     /** 
  139.      * 移除一個緩存 
  140.      */ 
  141.     public void remove(String key) { 
  142.         // 對內(nèi)是url的MD5 
  143.         String realKey = CipherUtils.md5(key); 
  144.         for (Map.Entry<String, Long> entry : cacheMap.entrySet()) { 
  145.             if (entry.getKey().startsWith(realKey)) { 
  146.                 cacheMap.remove(realKey); 
  147.                 return
  148.             } 
  149.         } 
  150.     } 
  151.   
  152.     /** 
  153.      * 如果緩存是有效的,就保存 
  154.      * @param res 將要緩存的數(shù)據(jù) 
  155.      */ 
  156.     private void saveCache(Result res) { 
  157.         if (res != null) { 
  158.             saveResultToCache(res); 
  159.             cacheMap.put(cacheName, System.currentTimeMillis()); 
  160.         } 
  161.     } 

 

責(zé)任編輯:chenqingxiang 來源: oschina
相關(guān)推薦

2024-12-09 09:25:30

2025-09-16 09:31:07

2024-09-23 04:00:00

java架構(gòu)分布式系統(tǒng)

2025-07-07 04:22:00

2009-06-23 18:01:45

Ajax框架源代碼

2018-08-31 08:42:48

LinuxUnix實用程序

2023-03-03 17:00:00

部署Linux內(nèi)核

2019-10-11 15:58:25

戴爾

2021-05-27 07:12:19

單點登錄系統(tǒng)

2021-03-29 11:20:39

前端代碼工作流

2025-04-07 07:45:00

AI模型神經(jīng)網(wǎng)絡(luò)

2025-09-30 07:16:59

2010-06-09 17:00:43

UML試題

2024-11-19 16:31:23

2022-02-25 09:00:00

數(shù)據(jù)科學(xué)工具架構(gòu)

2024-11-12 08:13:09

2020-12-08 08:12:14

SQL腳本行轉(zhuǎn)列

2010-12-24 11:27:13

華為HCNE認(rèn)證

2009-09-22 17:12:22

計算機原理教材

2021-05-06 11:06:52

人工智能語音識別聲聞檢索
點贊
收藏

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

日本亚洲免费观看| 97视频一区| 亚洲欧美一区二区视频| 国产专区欧美专区| 久视频在线观看| 校花撩起jk露出白色内裤国产精品 | 亚洲午夜久久久久久久久电影院| 国产精品久久久久久久天堂第1集| 国产又大又长又粗又黄| 亚洲第一视频在线| 久久久久久久欧美精品| 日韩日本欧美亚洲| 国产激情第一页| 狂野欧美性猛交xxxx| 亚洲一区二区三区美女| 翔田千里亚洲一二三区| 国产综合无码一区二区色蜜蜜| 午夜一级久久| 米奇精品一区二区三区在线观看| 手机在线成人av| 亚洲精品777| 五月婷婷综合激情| 香蕉视频在线网址| 免费在线黄色影片| 精品一区二区久久久| 69久久夜色精品国产69乱青草| 欧美色视频一区二区三区在线观看| 精品成人自拍视频| 欧美一区中文字幕| 人人干人人干人人| 亚洲欧美电影| 亚洲成人免费av| 欧美日韩免费高清| 色欲av永久无码精品无码蜜桃 | 色婷婷久久一区二区三区麻豆| 午夜在线视频免费观看| 精品推荐蜜桃传媒| 99精品欧美一区二区三区综合在线| 午夜一区二区三区在线观看| 欧美深深色噜噜狠狠yyy| 黄片毛片在线看| 国产精品自拍在线| 国产色综合天天综合网| 国产美女www爽爽爽| 亚洲在线电影| 51精品国产黑色丝袜高跟鞋| 久久久全国免费视频| 亚洲成人精选| 久热精品视频在线观看| 林心如三级全黄裸体| 国产一区二区精品福利地址| 亚洲欧美另类自拍| 免费a级黄色片| 欧美成人基地| 精品香蕉在线观看视频一| 中国免费黄色片| 成人资源在线| 亚洲国产精品福利| 性色av蜜臀av浪潮av老女人| 91在线一区| 亚洲成人网久久久| 这里只有精品在线观看视频| 看全色黄大色大片免费久久久| 欧美大片一区二区| 亚洲一区二区在线免费| 中文字幕一区二区三区日韩精品 | 丰满肉嫩西川结衣av| 国产精品一区二区久久不卡| 粉嫩av四季av绯色av第一区| 丰满人妻一区二区三区无码av| 成人午夜视频网站| 国产综合第一页| 日本中文字幕一区二区有码在线 | 日产中文字幕在线精品一区| 九色视频在线观看免费播放 | 日韩成人在线免费观看| 免费成人深夜夜行p站| 免费成人av| 最近更新的2019中文字幕| 亚洲欧美另类日本| 欧美~级网站不卡| 97久久久免费福利网址| 最近免费中文字幕大全免费版视频| 天堂影院一区二区| 91久久嫩草影院一区二区| 国产av一区二区三区精品| 国产精品一区二区男女羞羞无遮挡| 国产精品日韩欧美一区二区| 日本午夜在线| 成人欧美一区二区三区黑人麻豆| 91视频成人免费| 91美女主播在线视频| 91久久香蕉国产日韩欧美9色| 欧美一级视频在线| 国产精品极品在线观看| 精品视频在线导航| 永久免费未视频| 国产精品呻吟| 91影院在线免费观看视频| 欧美一级特黄aaaaaa| 91蜜桃免费观看视频| 手机成人av在线| 日产福利视频在线观看| 欧美绝品在线观看成人午夜影视| 97精品人人妻人人| 久久美女视频| 97精品国产91久久久久久| 日韩免费av网站| 丁香啪啪综合成人亚洲小说| 日日骚一区二区网站| 欧美色图天堂| 欧美少妇性性性| 国产一卡二卡三卡四卡| 久久美女精品| 国产精品91在线观看| 懂色av蜜臀av粉嫩av分享吧| 中文字幕第一区二区| 日本一区二区黄色| 天堂久久av| 日韩视频亚洲视频| 日本黄色中文字幕| 99久久精品免费| 国产美女作爱全过程免费视频| av免费在线一区| 日韩av有码在线| 久久久久久久九九九九| 精品一区二区三区的国产在线播放 | 日韩三区视频| 欧美日韩xxxxx| 国产精品久久久久久久一区二区| 久久伊人蜜桃av一区二区| 亚洲色成人www永久在线观看| 波多野结衣视频播放| 天堂精品在线视频| 久久国产精彩视频| 中文字幕日产av| 国产三级久久久| 国产淫片av片久久久久久| 精品国产午夜肉伦伦影院| 欧美日韩国产va另类| 国产情侣一区二区| 亚洲视频在线一区| 久久成年人网站| 99精品国产一区二区三区| 国产精品中文久久久久久久| 国产在线视频网站| 在线亚洲一区二区| 99久久久无码国产精品衣服| 久久亚洲风情| 日本日本精品二区免费| 欧美大片免费高清观看| 亚洲欧美在线免费观看| 国产91精品看黄网站在线观看| 91免费观看在线| 久久精品99国产| 国内精品视频在线观看| 日韩美女激情视频| 成全电影播放在线观看国语| 欧美在线视频不卡| 91免费在线看片| 精品一区二区三区免费观看| 国产美女视频免费| 亚洲精品国产九九九| 欧美激情久久久| 天堂av手机版| 亚洲大片一区二区三区| 91玉足脚交白嫩脚丫| 国产精品美女久久久| 欧美一二三区| 日本免费成人| 另类色图亚洲色图| 男人天堂手机在线观看| 欧美丝袜一区二区三区| 天天躁夜夜躁狠狠是什么心态| 免费在线观看日韩欧美| 一二三四中文字幕| 红杏一区二区三区| 国产精品com| 精品176二区| 亚洲第一页中文字幕| 久久久久久在线观看| 国产精品久久久久久久久快鸭 | 中文字幕人妻一区二区三区在线视频| 亚洲免费精品| 亚洲成人在线视频网站| 国产视频一区二| 91av在线看| 日本在线观看免费| 精品国产乱码久久久久久图片 | 欧美挠脚心视频网站| 免费中文字幕在线| 久久精品男人天堂av| 在线免费观看av网| 亚洲中字在线| 黄色高清视频网站| 亚洲另类av| 91久久久久久久一区二区| 一个人www视频在线免费观看| 日韩中文字幕不卡视频| 欧洲av在线播放| 欧美性生活大片视频| 在线看成人av| 国产精品国产馆在线真实露脸| 国产亚洲精品成人a| 免费观看成人av| 青青青在线视频播放| 日韩在线看片| 欧美成人免费在线| 少妇精品在线| 国产精品一区二区久久久久| 无遮挡爽大片在线观看视频| 超薄丝袜一区二区| 久久综合九色综合久| 精品国产一区二区三区四区四| 伊人网av在线| 色综合一个色综合亚洲| 国产一级在线观看视频| 中文字幕一区二区三区蜜月| 丰满少妇一区二区| 成人激情免费网站| 在线视频日韩欧美| 麻豆免费精品视频| 97在线免费公开视频| 亚洲国产婷婷| 精品人妻人人做人人爽| 欧美h版在线| 日韩jizzz| 国产99精品一区| 国产有色视频色综合| 一级毛片精品毛片| 91亚洲国产成人久久精品网站| 国产精品久久久久久久久久齐齐| 日本国产一区二区三区| 密臀av在线播放| 国内伊人久久久久久网站视频| 黄色一级片在线免费观看| 国产韩国精品一区二区三区| 噜噜噜噜噜久久久久久91| xxxxxhd亚洲人hd| 亚洲综合社区网| 电影91久久久| 91在线高清免费观看| 午夜不卡一区| 成人观看高清在线观看免费| 久久精品国产精品亚洲毛片| 国产精品第一视频| 亚洲天堂1区| 国产精品一区二区三区久久| 播放一区二区| 国产精品视频大全| 国产精品蜜月aⅴ在线| 国产在线视频不卡| 亚洲资源在线| 91视频婷婷| 哺乳挤奶一区二区三区免费看| 91免费看网站| 国产厕拍一区| 免费看成人片| 国产精品一区2区3区| 日韩电影免费观看在| 成人中文视频| 热这里只有精品| 国产精品无码一区二区桃花视频| 亚洲国产wwwccc36天堂| 日本熟妇毛茸茸丰满| 欧美午夜精品久久久久久人妖| 日本三级小视频| 在线视频欧美精品| 一区二区三区免费观看视频| 欧美一区二区不卡视频| 亚洲精品福利网站| 日韩精品高清视频| 成人资源www网在线最新版| 色偷偷9999www| 天堂av最新在线| 国产91精品视频在线观看| 日本欧美韩国| 亚洲一区亚洲二区亚洲三区| 成人高潮视频| 欧美日韩精品免费看| 久久网站免费观看| 日韩精品综合在线| 日韩激情av在线| 99视频在线观看视频| 99精品久久只有精品| 国产真人真事毛片视频| 一区二区三区四区蜜桃| 亚洲 欧美 成人| 6080国产精品一区二区| 日韩在线观看视频一区| 一区二区亚洲精品国产| 日本中文字幕中出在线| 日韩av免费一区| 日韩精品视频中文字幕| 牛人盗摄一区二区三区视频| 午夜国产一区二区| 国产免费黄色av| 国产麻豆精品视频| a级在线免费观看| 免费成人三级| 国产精品一区二区三区不卡| 国产精品免费大片| 人妻少妇精品久久| 久久国产日韩欧美精品| 亚洲永久无码7777kkk| 一区二区三区四区亚洲| 中文字幕自拍偷拍| 亚洲成人精品久久久| 蜜桃视频在线观看免费视频网站www| 亚洲91精品在线观看| 亚洲日日夜夜| 日韩不卡av| 亚洲一区不卡| 一级全黄裸体片| 亚洲天天做日日做天天谢日日欢| 欧美一二三区视频| 91精品国产欧美日韩| 黄色的视频在线免费观看| 久久人人爽人人爽人人片av高请 | 3d动漫精品啪啪一区二区下载 | 国产激情在线看| 日韩**一区毛片| 蜜桃精品成人影片| 亚洲综合清纯丝袜自拍| 亚洲中文字幕一区二区| 亚洲人免费视频| 涩涩视频在线| 国产女主播一区二区| 欧美搞黄网站| 日韩精品视频网址| 中文字幕一区二区三区在线观看| 波多野结衣网站| 亚洲欧美在线第一页| 国产精选在线| 国产一区免费观看| 亚洲国产导航| 国产高清成人久久| 亚洲观看高清完整版在线观看| 国产精品毛片久久久久久久av | 老司机精品免费视频| 91国偷自产一区二区三区观看| 午夜视频在线播放| 亚洲精品成人a在线观看| 一级特黄a大片免费| 亚洲第一综合色| 国产xxxx在线观看| 一区二区三区视频在线| 成人涩涩视频| 亚洲一区二区三区午夜| 午夜在线精品| 国产精品探花一区二区在线观看| 亚洲综合在线观看视频| 亚洲精品人妻无码| 久久夜色精品国产欧美乱| 99国内精品久久久久| 99re视频精品| 国产老头老太做爰视频| 欧美日本在线观看| 毛片网站在线免费观看| 91手机视频在线观看| 综合激情视频| 亚洲视频 中文字幕| 亚洲不卡一区二区三区| 亚洲色图欧美视频| 国产精品wwww| 91精品国产自产拍在线观看蜜| 亚欧美一区二区三区| 亚洲v中文字幕| 黄色片在线免费看| 国产女精品视频网站免费| 91av精品| av网页在线观看| 在线视频一区二区免费| 巨大荫蒂视频欧美大片| 国产99午夜精品一区二区三区 | 久久久久久成人| 天堂网av成人| 中文字幕免费高清在线| 亚洲国产日韩a在线播放 | 欧美乱妇40p| 日韩动漫一区| www.超碰97.com| 亚洲成av人影院| 91ph在线| 国产精品久久一区二区三区| 亚洲一区区二区| 免费在线观看黄色小视频| 精品成人一区二区三区| 日韩天堂在线| 性一交一乱一伧国产女士spa| 国产拍揄自揄精品视频麻豆| 国产老妇伦国产熟女老妇视频| 午夜精品蜜臀一区二区三区免费| 郴州新闻综合频道在线直播| 好吊操视频这里只有精品| 操欧美女人视频| 成人在线免费观看av| 亚洲同性gay激情无套| 亚洲av片在线观看| 亚洲直播在线一区|