亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Android圖片三級(jí)緩存策略(網(wǎng)絡(luò)、本地、內(nèi)存緩存)

2019-12-12 06:41:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、簡(jiǎn)介

現(xiàn)在的Android應(yīng)用程序中,不可避免的都會(huì)使用到圖片,如果每次加載圖片的時(shí)候都要從網(wǎng)絡(luò)重新拉取,這樣不但很耗費(fèi)用戶的流量,而且圖片加載的也會(huì)很慢,用戶體驗(yàn)很不好。所以一個(gè)應(yīng)用的圖片緩存策略是很重要的。通常情況下,Android應(yīng)用程序中圖片的緩存策略采用“內(nèi)存-本地-網(wǎng)絡(luò)”三級(jí)緩存策略,首先應(yīng)用程序訪問(wèn)網(wǎng)絡(luò)拉取圖片,分別將加載的圖片保存在本地SD卡中和內(nèi)存中,當(dāng)程序再一次需要加載圖片的時(shí)候,先判斷內(nèi)存中是否有緩存,有則直接從內(nèi)存中拉取,否則查看本地SD卡中是否有緩存,SD卡中如果存在緩存,則圖片從SD卡中拉取,否則從網(wǎng)絡(luò)加載圖片。依據(jù)這三級(jí)緩存機(jī)制,可以讓我們的應(yīng)用程序在加載圖片的時(shí)候做到游刃有余,有效的避免內(nèi)存溢出。

PS:當(dāng)然現(xiàn)在處理網(wǎng)絡(luò)圖片的時(shí)候,一般人都會(huì)選擇XUtils中的BitmapUtil,它已經(jīng)將網(wǎng)絡(luò)緩存處理的相當(dāng)好了,使用起來(lái)非常方便--本人就一直在用。仿照BitMapUtil的實(shí)現(xiàn)思路,定制一個(gè)自己的圖片加載工具,來(lái)理解一下三級(jí)緩存的策略,希望對(duì)自己會(huì)有一個(gè)提升。

二、網(wǎng)絡(luò)緩存

網(wǎng)絡(luò)拉取圖片嚴(yán)格來(lái)講不能稱之為緩存,實(shí)質(zhì)上就是下載url對(duì)應(yīng)的圖片,我們這里姑且把它看作是緩存的一種。仿照BitmapUtil中的display方法,我自己定制的CustomBitmapUtils也定義這個(gè)方法,根據(jù)傳入的url,將圖片設(shè)置到ivPic控件上。

public void display(ImageView ivPic, String url) {}

定義網(wǎng)絡(luò)緩存的工具類,在訪問(wèn)網(wǎng)絡(luò)的時(shí)候,我使用了AsyncTask來(lái)實(shí)現(xiàn),在AsyncTask的doInBackGround方法里下載圖片,然后將 圖片設(shè)置給ivPic控件,AsyncTask有三個(gè)泛型,其中第一個(gè)泛型是執(zhí)行異步任務(wù)的時(shí)候,通過(guò)execute傳過(guò)來(lái)的參數(shù),第二個(gè)泛型是更新的進(jìn)度,第三個(gè)泛型是異步任務(wù)執(zhí)行完成之后,返回來(lái)的結(jié)果,我們這里返回一個(gè)Bitmap。具體的下載實(shí)現(xiàn)代碼如下:

/** * 網(wǎng)絡(luò)緩存的工具類 * * @author ZHY * */ public class NetCacheUtils{ private LocalCacheUtils localCacheUtils;private MemoryCacheUtils memoryCacheUtils; public NetCacheUtils() { localCacheUtils = new LocalCacheUtils();memoryCacheUtils = new MemoryCacheUtils(); } /** * 從網(wǎng)絡(luò)下載圖片 * * @param ivPic *@param url */ public void getBitmapFromNet(ImageView ivPic, String url) {// 訪問(wèn)網(wǎng)絡(luò)的操作一定要在子線程中進(jìn)行,采用異步任務(wù)實(shí)現(xiàn) MyAsyncTask task = new MyAsyncTask(); task.execute(ivPic, url); } /** * 第一個(gè)泛型--異步任務(wù)執(zhí)行的時(shí)候,通過(guò)execute傳過(guò)來(lái)的參數(shù);第二個(gè)泛型--更新進(jìn)度; 第三個(gè)泛型--異步任務(wù)執(zhí)行以后返回的結(jié)果 * * @author ZHY * */ private class MyAsyncTask extends AsyncTask { private ImageView ivPic; private String url; // 耗時(shí)任務(wù)執(zhí)行之前--主線程@Override protected void onPreExecute() { super.onPreExecute(); } // 后臺(tái)執(zhí)行的任務(wù)@Override protected Bitmap doInBackground(Object... params) { // 執(zhí)行異步任務(wù)的時(shí)候,將URL傳過(guò)來(lái) ivPic = (ImageView) params[0]; url = (String) params[1]; Bitmap bitmap = downloadBitmap(url); // 為了保證ImageView控件和URL一一對(duì)應(yīng),給ImageView設(shè)定一個(gè)標(biāo)記 ivPic.setTag(url);// 關(guān)聯(lián)ivPic和URL return bitmap; }// 更新進(jìn)度 --主線程 @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); }// 耗時(shí)任務(wù)執(zhí)行之后--主線程 @Override protected void onPostExecute(Bitmap result){ String mCurrentUrl = (String) ivPic.getTag(); if (url.equals(mCurrentUrl)){ ivPic.setImageBitmap(result); System.out.println("從網(wǎng)絡(luò)獲取圖片"); // 從網(wǎng)絡(luò)加載完之后,將圖片保存到本地SD卡一份,保存到內(nèi)存中一份 localCacheUtils.setBitmap2Local(url, result); // 從網(wǎng)絡(luò)加載完之后,將圖片保存到本地SD卡一份,保存到內(nèi)存中一份 memoryCacheUtils.setBitmap2Memory(url, result);} } }/** * 下載網(wǎng)絡(luò)圖片 ** @param url * @return */private Bitmap downloadBitmap(String url){ HttpURLConnection conn = null;try { URL mURL = new URL(url); // 打開(kāi)HttpURLConnection連接 conn = (HttpURLConnection) mURL.openConnection(); // 設(shè)置參數(shù) conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setRequestMethod("GET"); // 開(kāi)啟連接 conn.connect(); // 獲得響應(yīng)碼 int code = conn.getResponseCode();if (code == 200) { // 相應(yīng)成功,獲得網(wǎng)絡(luò)返回來(lái)的輸入流 InputStream is = conn.getInputStream(); // 圖片的輸入流獲取成功之后,設(shè)置圖片的壓縮參數(shù),將圖片進(jìn)行壓縮 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;// 將圖片的寬高都?jí)嚎s為原來(lái)的一半,在開(kāi)發(fā)中此參數(shù)需要根據(jù)圖片展示的大小來(lái)確定,否則可能展示的不正常 options.inPreferredConfig = Bitmap.Config.RGB_565;// 這個(gè)壓縮的最小 // Bitmap bitmap = BitmapFactory.decodeStream(is); Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);// 經(jīng)過(guò)壓縮的圖片 return bitmap; } } catch (Exception e){ e.printStackTrace(); } finally {// 斷開(kāi)連接 conn.disconnect(); } return null; } }

三、本地緩存

從網(wǎng)絡(luò)加載完圖片之后,將圖片保存到本地SD卡中。在加載圖片的時(shí)候,判斷一下SD卡中是否有圖片緩存,如果有,就直接從SD卡加載圖片。本地緩存的工具類中有兩個(gè)公共的方法,分別是向本地SD卡設(shè)置網(wǎng)絡(luò)圖片,獲取SD卡中的圖片。設(shè)置圖片的時(shí)候采用鍵值對(duì)的形式進(jìn)行存儲(chǔ),將圖片的url作為鍵,作為文件的名字,圖片的Bitmap作位值來(lái)保存。由于url含有特殊字符,不能直接作為圖片的名字來(lái)存儲(chǔ),故采用url的MD5值作為文件的名字。

/*** 本地緩存* * @author ZHY* */public class LocalCacheUtils {/*** 文件保存的路徑*/public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/cache/pics";/*** 從本地SD卡獲取網(wǎng)絡(luò)圖片,key是url的MD5值* * @param url* @return*/public Bitmap getBitmapFromLocal(String url) {try {String fileName = MD5Encoder.encode(url);File file = new File(FILE_PATH, fileName);if (file.exists()) {Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));return bitmap;}} catch (Exception e) {e.printStackTrace();}return null;}/*** 向本地SD卡寫(xiě)網(wǎng)絡(luò)圖片* * @param url* @param bitmap*/public void setBitmap2Local(String url, Bitmap bitmap) {try {// 文件的名字String fileName = MD5Encoder.encode(url);// 創(chuàng)建文件流,指向該路徑,文件名叫做fileNameFile file = new File(FILE_PATH, fileName);// file其實(shí)是圖片,它的父級(jí)File是文件夾,判斷一下文件夾是否存在,如果不存在,創(chuàng)建文件夾File fileParent = file.getParentFile();if (!fileParent.exists()) {// 文件夾不存在fileParent.mkdirs();// 創(chuàng)建文件夾}// 將圖片保存到本地bitmap.compress(CompressFormat.JPEG, 100,new FileOutputStream(file));} catch (Exception e) {e.printStackTrace();}}}

四、內(nèi)存緩存

內(nèi)存緩存說(shuō)白了就是在內(nèi)存中保存一份圖片集合,首先會(huì)想到HashMap這種鍵值對(duì)的形式來(lái)進(jìn)行保存,以u(píng)rl作為key,bitmap作為value。但是在Java中這種默認(rèn)的new對(duì)象的方式是強(qiáng)引用,JVM在進(jìn)行垃圾回收的時(shí)候是不會(huì)回收強(qiáng)引用的,所以如果加載的圖片過(guò)多的話,map會(huì)越來(lái)越大,很容易出現(xiàn)OOM異常。在Android2.3之前,還可以通過(guò)軟引用或者弱引用來(lái)解決,但是Android2.3之后,Google官方便不再推薦軟引用了,Google推薦我們使用LruCache。

在過(guò)去,我們經(jīng)常會(huì)使用一種非常流行的內(nèi)存緩存技術(shù)的實(shí)現(xiàn),即軟引用或弱引用 (SoftReference or WeakReference)。但是現(xiàn)在已經(jīng)不再推薦使用這種方式了,因?yàn)閺?Android 2.3 (API Level 9)開(kāi)始,垃圾回收器會(huì)更傾向于回收持有軟引用或弱引用的對(duì)象,這讓軟引用和弱引用變得不再可靠。另外,Android 3.0 (API Level 11)中,圖片的數(shù)據(jù)會(huì)存儲(chǔ)在本地的內(nèi)存當(dāng)中,因而無(wú)法用一種可預(yù)見(jiàn)的方式將其釋放,這就有潛在的風(fēng)險(xiǎn)造成應(yīng)用程序的內(nèi)存溢出并崩潰。

為了能夠選擇一個(gè)合適的緩存大小給LruCache, 有以下多個(gè)因素應(yīng)該放入考慮范圍內(nèi),例如:

你的設(shè)備可以為每個(gè)應(yīng)用程序分配多大的內(nèi)存?Android默認(rèn)是16M。 設(shè)備屏幕上一次最多能顯示多少?gòu)垐D片?有多少圖片需要進(jìn)行預(yù)加載,因?yàn)橛锌赡芎芸煲矔?huì)顯示在屏幕上? 你的設(shè)備的屏幕大小和分辨率分別是多少?一個(gè)超高分辨率的設(shè)備(例如 Galaxy Nexus) 比起一個(gè)較低分辨率的設(shè)備(例如 Nexus S),在持有相同數(shù)量圖片的時(shí)候,需要更大的緩存空間。 圖片的尺寸和大小,還有每張圖片會(huì)占據(jù)多少內(nèi)存空間。 圖片被訪問(wèn)的頻率有多高?會(huì)不會(huì)有一些圖片的訪問(wèn)頻率比其它圖片要高?如果有的話,你也許應(yīng)該讓一些圖片常駐在內(nèi)存當(dāng)中,或者使用多個(gè)LruCache 對(duì)象來(lái)區(qū)分不同組的圖片。 你能維持好數(shù)量和質(zhì)量之間的平衡嗎?有些時(shí)候,存儲(chǔ)多個(gè)低像素的圖片,而在后臺(tái)去開(kāi)線程加載高像素的圖片會(huì)更加的有效。 以上是Google對(duì)LruCache的描述,其實(shí)LruCache的使用非常簡(jiǎn)單,跟Map非常相近,只是在創(chuàng)建LruCache對(duì)象的時(shí)候需要指定它的最大允許內(nèi)存,一般設(shè)置為當(dāng)前應(yīng)用程序的最大運(yùn)行內(nèi)存的八分之一即可。

/*** 內(nèi)存緩存* * @author ZHY* */public class MemoryCacheUtils {/** 由于map默認(rèn)是強(qiáng)引用,所有在JVM進(jìn)行垃圾回收的時(shí)候不會(huì)回收map的引用*/// private HashMap<string, bitmap=""> map = new HashMap<string, bitmap="">();// 軟引用的實(shí)例,在內(nèi)存不夠時(shí),垃圾回收器會(huì)優(yōu)先考慮回收// private HashMap<string, bitmap="">> mSoftReferenceMap = new// HashMap<string, bitmap="">>();// LruCacheprivate LruCache<string, bitmap=""> lruCache;public MemoryCacheUtils() {// lruCache最大允許內(nèi)存一般為Android系統(tǒng)分給每個(gè)應(yīng)用程序內(nèi)存大?。J(rèn)Android系統(tǒng)給每個(gè)應(yīng)用程序分配16兆內(nèi)存)的八分之一(推薦)// 獲得當(dāng)前應(yīng)用程序運(yùn)行的內(nèi)存大小long mCurrentMemory = Runtime.getRuntime().maxMemory();int maxSize = (int) (mCurrentMemory / 8);// 給LruCache設(shè)置最大的內(nèi)存lruCache = new LruCache<string, bitmap="">(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap value) {// 獲取每張圖片所占內(nèi)存的大小// 計(jì)算方法是:圖片顯示的寬度的像素點(diǎn)乘以高度的像素點(diǎn)int byteCount = value.getRowBytes() * value.getHeight();// 獲取圖片占用內(nèi)存大小return byteCount;}};}/*** 從內(nèi)存中讀取Bitmap* * @param url* @return*/public Bitmap getBitmapFromMemory(String url) {// Bitmap bitmap = map.get(url);// SoftReference<bitmap> softReference = mSoftReferenceMap.get(url);// Bitmap bitmap = softReference.get();// 軟引用在Android2.3以后就不推薦使用了,Google推薦使用lruCache// LRU--least recently use// 最近最少使用,將內(nèi)存控制在一定的大小內(nèi),超過(guò)這個(gè)內(nèi)存大小,就會(huì)優(yōu)先釋放最近最少使用的那些東東Bitmap bitmap = lruCache.get(url);return bitmap;}/*** 將圖片保存到內(nèi)存中* * @param url* @param bitmap*/public void setBitmap2Memory(String url, Bitmap bitmap) {// 向內(nèi)存中設(shè)置,key,value的形式,首先想到HashMap// map.put(url, bitmap);// 保存軟引用到map中// SoftReference<bitmap> mSoftReference = new// SoftReference<bitmap>(bitmap);// mSoftReferenceMap.put(url, mSoftReference);lruCache.put(url, bitmap);}}</bitmap></bitmap></bitmap></string,></string,></string,></string,></string,></string,>

好了?,F(xiàn)在三級(jí)緩存策略封裝完畢,接下來(lái)定制我們自己的BitmapUtils

/*** 自定義的加載圖片的工具類,類似于Xutils中的BitmapUtil,在實(shí)際使用中,一般使用BitmapUtil,為了理解三級(jí)緩存,* 這里模擬BitmapUtil自定義了CustomBitmapUtil* * @author ZHY* */public class CustomBitmapUtils {private Bitmap bitmap;private NetCacheUtils netCacheUtils;private LocalCacheUtils localCacheUtils;private MemoryCacheUtils memoryCacheUtils;public CustomBitmapUtils() {netCacheUtils = new NetCacheUtils();localCacheUtils = new LocalCacheUtils();memoryCacheUtils = new MemoryCacheUtils();}/*** 加載圖片,將當(dāng)前URL對(duì)應(yīng)的圖片顯示到ivPic的控件上* * @param ivPic* ImageView控件* @param url* 圖片的地址*/public void display(ImageView ivPic, String url) {// 設(shè)置默認(rèn)顯示的圖片ivPic.setImageResource(R.drawable.ic_launcher);// 1、內(nèi)存緩存bitmap = memoryCacheUtils.getBitmapFromMemory(url);if (bitmap != null) {ivPic.setImageBitmap(bitmap);System.out.println("從內(nèi)存緩存中加載圖片");return;}// 2、本地磁盤(pán)緩存bitmap = localCacheUtils.getBitmapFromLocal(url);if (bitmap != null) {ivPic.setImageBitmap(bitmap);System.out.println("從本地SD卡加載的圖片");memoryCacheUtils.setBitmap2Memory(url, bitmap);// 將圖片保存到內(nèi)存return;}// 3、網(wǎng)絡(luò)緩存netCacheUtils.getBitmapFromNet(ivPic, url);/** 從網(wǎng)絡(luò)獲取圖片之后,將圖片保存到手機(jī)SD卡中,在進(jìn)行圖片展示的時(shí)候,優(yōu)先從SD卡中讀取緩存,key是圖片的URL的MD5值,* value是保存的圖片bitmap*/}}

在mainActivity中使用ListView加載網(wǎng)絡(luò)圖片

/*** Android中三級(jí)緩存--網(wǎng)絡(luò)緩存-本地緩存-內(nèi)存緩存* * @author ZHY* */public class MainActivity extends Activity {private ListView list;private Button btn;private CustomBitmapUtils utils;private static final String BASE_URL = "http://192.168.0.148:8080/pics";// 初始化一些網(wǎng)絡(luò)圖片String[] urls = { BASE_URL + "/1.jpg", BASE_URL + "/2.jpg",BASE_URL + "/3.jpg", BASE_URL + "/4.jpg", BASE_URL + "/5.jpg",BASE_URL + "/6.jpg", BASE_URL + "/7.jpg", BASE_URL + "/8.jpg",BASE_URL + "/9.jpg", BASE_URL + "/10.jpg", BASE_URL + "/11.jpg",BASE_URL + "/12.jpg", BASE_URL + "/13.jpg", BASE_URL + "/14.jpg",BASE_URL + "/15.jpg", BASE_URL + "/16.jpg", BASE_URL + "/17.jpg",BASE_URL + "/18.jpg", BASE_URL + "/19.jpg", BASE_URL + "/20.jpg",BASE_URL + "/21.jpg", BASE_URL + "/22.jpg", BASE_URL + "/23.jpg",BASE_URL + "/24.jpg", BASE_URL + "/25.jpg", BASE_URL + "/26.jpg",BASE_URL + "/27.jpg", BASE_URL + "/28.jpg", BASE_URL + "/29.jpg",BASE_URL + "/30.jpg" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list = (ListView) findViewById(R.id.list);btn = (Button) findViewById(R.id.btn_load);utils = new CustomBitmapUtils();// 加載網(wǎng)絡(luò)圖片btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {MyAdapter adapter = new MyAdapter();list.setAdapter(adapter);}});}class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return urls.length;}@Overridepublic String getItem(int position) {return urls[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = View.inflate(MainActivity.this,R.layout.item_list, null);holder = new ViewHolder();holder.ivPic = (ImageView) convertView.findViewById(R.id.iv);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}utils.display(holder.ivPic, urls[position]);return convertView;}class ViewHolder {ImageView ivPic;}}}

運(yùn)行的結(jié)果如下:

程序第一次運(yùn)行,日志打印如下

之后將圖片緩存在SD卡中,從本地加載圖片


然后將圖片緩存到內(nèi)存,從內(nèi)存加載圖片


OK,到目前為止,Android中圖片的三級(jí)緩存原理就都介紹完了,我自己本人受益匪淺,希望能夠幫助到需要的朋友。需要源碼的請(qǐng)點(diǎn)擊如下鏈接進(jìn)行下載。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
女生裸体无遮挡天堂网站免费| 亚洲精品爱爱久久| 在线精品国精品国产尤物884a| 午夜视频在线观看国产| 久久国产日韩欧美精品| 欧美freesex交免费视频| 国产精品69av| www.日韩在线| 亚洲一区二区色| 亚洲丝袜另类动漫二区| 国产亚洲欧美在线| 麻豆精品一区| 国精产品一区二区三区| 色的视频在线观看免费播放| 欧亚精品在线观看| 性伦欧美刺激片在线观看| 精品国内自产拍在线观看视频| 亚洲在线视频福利| 欧美有码在线观看视频| 欧美日韩小视频| 久久久水蜜桃av免费网站| 制服丝袜在线一区| 欧美天堂亚洲电影院在线播放| 9色精品在线| 精品一区二区三区电影| 日本在线播放一区| 欧美极品aⅴ影院| 欧美精品在线视频| 福利网站在线观看| 久久综合九色综合欧美就去吻| 欧美日韩美女| 亚洲国产精品久久人人爱潘金莲| 美女视频免费观看网站在线| 免费黄色av片| 久久97久久97精品免视看| 午夜电影网一区| 天堂网免费视频| 性生活视频网站| 99久久国产视频| 精品一区二区三区在线| 成年人黄视频在线观看| 精品视频一区在线| 欧美在线观看日本一区| 蜜桃传媒视频麻豆第一区免费观看| 在线观看导航| 日本精品久久久久中文| 欧美日韩亚洲一区二区三区| 成人综合专区| 日本最新高清不卡中文字幕| 黄色的视频在线免费观看| 欧洲中文字幕国产精品| 久久精品导航| 超碰成人福利| 日韩一级免费视频| 草草视频在线播放| 成人网在线免费看| 亚洲综合久久久久| 日韩成人免费在线观看| 午夜羞羞视频| 精品国产福利一区二区在线| 欧美三级午夜理伦三级| 91超碰rencao97精品| 三级av在线免费观看| 亚洲精品福利在线| 岛国视频一区免费观看| 国产一区二区视频在线观看免费| 免费黄色特级片| 99re6这里只有精品视频在线观看| 粉嫩老牛aⅴ一区二区三区| 亚洲在线视频福利| 欧美国产高潮xxxx1819| 日韩专区在线观看| 日韩中文字幕高清| 91国内精品久久久| 国产777精品精品热热热一区二区| 日韩欧美一级二级| 视频精品二区| 日韩在线观看一区二区| 妖精一区二区三区精品视频| 精品久久久久中文字幕小说| 欧美在线视频一区二区三区| 可以免费看污视频的网站在线| 国产精品美女在线| 天堂网一区二区三区| 无码人妻丰满熟妇区五十路| 亚洲天堂免费观看| 国产精品国内免费一区二区三区| 久久6免费视频| 亚洲精品自拍| 三级在线观看免费大全| 91午夜理伦私人影院| 国产精品久久无码一三区| 国产精品中文字幕欧美| 18av.com视频| 波多野结衣在线电影| 97人人做人人爱| 欧美日韩在线直播| 久久精品无码av| 欧美 日韩 国产在线观看| 国产精品久久成人免费观看| 亚洲精品白浆高清久久久久久| 中文天堂在线播放| 一区二区国产精品视频| 久久九九热re6这里有精品| 碰草在线视频| 亚洲人成电影院在线观看| 人妻精品无码一区二区三区| 久久久一区二区三区四区| 日韩久久久久久久久久久| 波波电影院一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 色屁屁草草影院ccyy.com| 国产第一页在线播放| 天天摸天天做天天爽水多| 国产一区欧美| 999人在线精品播放视频| 国产精品青草久久| 免费av一区二区三区| 黄色网一区二区| 在线观看亚洲一区二区| 91久久精品日日躁夜夜躁欧美| 亚洲国产99精品国自产| 免费黄视频网站| 日韩视频在线观看一区| 亚洲国产成人影院播放| 国产91成人video| 成人欧美一区二区三区小说| 欧美a一区二区| 91蜜桃网址入口| 亚洲一区制服诱惑| 丁香桃色午夜亚洲一区二区三区| 欧美激情免费看| 伊人精品视频在线观看| 99精品一级欧美片免费播放| 精品综合久久| 痴汉一区二区三区| 亚洲va在线va天堂成人| 精品96久久久久久中文字幕无| 蜜桃视频m3u8在线观看| 亚洲性xxxx| 狠狠人妻久久久久久| 91精品国产99久久久久久红楼| 蜜臀av午夜精品| 久久天天东北熟女毛茸茸| 视频一区在线免费观看| 怡红院精品视频在线观看极品| 欧美日韩日本视频| 国产女人18毛片水真多18精品| 免费看一级一片| 欧美三级理伦电影| 在线免费日韩av| 亚洲精品免费网站| 欧美三日本三级三级在线播放| 日韩精品久久| 中文人妻av久久人妻18| 精品视频一区二区三区免费| 国产精品嫩草影院久久久| 日韩乱码人妻无码中文字幕久久| 2021国产精品久久精品| 国产经典久久久| 欧美精品国产精品久久久| 男女视频免费网站| 天天爽天天狠久久久| 综合久久一区| 美女国产精品久久久| 久久精品国产亚洲AV无码男同| 色婷婷精品久久二区二区密| 亚洲一区中文字幕永久在线| 欧美精品videossex性护士| 欧美肥婆姓交大片| 九九热在线播放| 18一19gay欧美视频网站| 9191精品国产综合久久久久久| 精品av综合导航| 亚洲高清激情| 91精品国产麻豆国产自产在线| www夜片内射视频日韩精品成人| 日韩av大片在线观看| 国产精品三p一区二区| 美女做a视频| 国产精品久久久久久久美男| 国产日本韩国在线播放| 992kp免费看片| 影音先锋国产资源站| 欧美一级免费观看| 精品一区二区视频| 在线视频欧美日韩精品| 波多野结衣在线网站| 国产精品视频流白浆免费视频| 成人午夜电影在线播放| 欧美成人三级在线播放| 伊人狠狠色j香婷婷综合| 91ph在线| 97在线播放视频| 在线免费av资源| 日韩高清国产一区在线观看| 日本精品一二三区| 一区二区精品免费视频| 免费看国产曰批40分钟| 男女无套免费视频网站动漫| 精品国产18久久久久久洗澡| 欧美日韩一二区| 国产亚洲欧洲高清一区| 视频91a欧美| 三级精品视频| 国产精品人成在线观看免费| 欧美午夜精彩| 免费在线观看黄色网| 精品少妇一区二区三区日产乱码| 国产精品久久久久久久久久久久久久久| 国产精品老女人| 成人av在线影院| 激情五月婷婷综合网| 亚洲国产视频二区| 日韩电影免费在线看| 天堂av免费看| 亚洲网站情趣视频| 黑鬼狂亚洲人videos| 蜜桃久久久久| 亚洲综合激情在线| 国产精品v欧美精品v日本精品动漫| 国产综合第一页| 亚洲欧美国产高清va在线播放| 99精品视频在线播放观看| 在线播放的av| 欧美一区二区三区免费看| 亚洲五码中文字幕| 影音先锋久久| 中文字幕电影一区| 欧美日本三区| 欧美巨乳美女视频| 嫩草影院懂你的影院| 亚洲成人福利在线| 在线a人片免费观看视频| 中文天堂在线一区| 久久久久亚洲av成人毛片韩| 久久深夜福利免费观看| 91成品人片a无限观看| 久久久久88色偷偷| 中文字幕一区二区三区人妻不卡| 91免费看片在线观看| 亚洲国产精品中文| 欧美国产激情18| 蜜桃av一区二区在线观看| 天天做天天躁天天躁| 日韩免费电影| 欧美激情久久久久久久久久久| 日韩av中文| 久久久久久久人妻无码中文字幕爆| 亚洲黄色小说在线观看| 91精品动漫在线观看| 国产女精品视频网站免费| 美女av免费观看| 国产免费xxx| 亚洲精品国产精品久久清纯直播| 97在线视频免费播放| 国产一区激情在线| 国产久卡久卡久卡久卡视频精品| 91网上在线视频| 99精产国品一二三产品香蕉| 毛片在线播放a| 日本一区影院| 亚洲无线码在线一区观看| 国产精品1000| 欧美亚洲国产一卡| 伊人av电影| 一二三四社区在线视频| 亚洲人成电影网站色xx| 精品国产91乱码一区二区三区| 成人av色在线观看| 激情 小说 亚洲 图片: 伦| 色中色综合影院手机版在线观看| 成人免费视频毛片| 国产精品日韩专区| 制服丝袜影音| 国产69精品久久久久按摩| 在线观看污污视频| h版电影在线播放视频网站| 国产成人aa在线观看网站站| 欧美v亚洲v| 久久中文字幕一区二区三区| 黄色免费av网站| 欧美专区在线观看一区| 天天色天天上天天操| 久久av红桃一区二区禁漫| 国产精品激情av在线播放| 日韩在线激情| 亚洲国产一区二区在线播放| 97精品视频在线观看自产线路二| 中文在线不卡| 人人妻人人澡人人爽人人精品| 三级网站在线播放| 一区二区三区天堂av| 国产精品劲爆视频| 丁香婷婷深情五月亚洲| 久久精品一区二区不卡| porn视频在线观看| 91国语精品自产拍在线观看性色| 精品国产91久久久久久久妲己| 日韩三级在线| 私人影视中文字幕| 新版的欧美在线视频| 亚洲国产精品一区二区www在线| 国产+人+亚洲| 日韩精品欧美一区二区三区| gogo大尺度成人免费视频| 羞羞漫画网18久久app| 国产精品久久久久久久久久久久久| jizz欧美| 日本一区二区三区在线视频| 在线观看毛片网站| 极品美女一区| 在线免费看av的网站| 国内精品麻豆美女在线播放视频| 综合激情视频| 日韩欧美在线观看免费| 亚洲一区日韩精品中文字幕| 国产精品视频最多的网站| 污视频网站免费| 欧美一级高清片| 亚洲欧美成人在线| 亚洲欧美日韩一区二区在线| av一级毛片| 国产suv精品一区二区6| 国内精品久久久久久久久| 尤物视频在线观看视频| 日韩精品免费电影| 女人体1963|