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

淺淡MVP的實(shí)戰(zhàn)演習(xí),讓代碼結(jié)構(gòu)更簡(jiǎn)單~

移動(dòng)開(kāi)發(fā) Android
用過(guò)MVP的人一定會(huì)覺(jué)得,在Android中,代碼很清晰,不過(guò)多了很多類。對(duì)于大多數(shù)人而言,在看MVP的Demo的時(shí)候,一眼便是慢慢的nice,然而讓自己來(lái)寫(xiě)個(gè)例子,卻很頭疼寫(xiě)不出來(lái)。但的確MVC模式寫(xiě)起來(lái)更加像是順?biāo)浦邸V恍枰炎约旱臉I(yè)務(wù)邏輯一股腦的放進(jìn)Activity就成功完事兒。

前言

講道理,這次是真的筆者很久都沒(méi)有更新blog了,主要最近維護(hù)的框架問(wèn)題也是層出不窮,而且對(duì)技術(shù)交流群的解答也讓我身心疲憊,所以在這里跟關(guān)注我的人說(shuō)聲抱歉,沒(méi)有定期給你們帶來(lái)福利,那么這里就給大家?guī)?lái)一個(gè)重磅福利:愛(ài)吖妹紙——Retrofit & RxJava & MVP & Butterknife 的完整App.

講到最近讓我身心疲憊的問(wèn)題解答,無(wú)疑是讓我在開(kāi)源的路上越走越遠(yuǎn),雖然我不是技術(shù)大牛,卻依然被一些很簡(jiǎn)單的問(wèn)題輪番轟炸,其實(shí)筆者的內(nèi)心真的是拒絕的。不得不說(shuō),寫(xiě)給技術(shù)群內(nèi)的你和群主,為什么你提問(wèn),而總沒(méi)人回你!寫(xiě)的挺好。

概述

廢話也不多說(shuō),對(duì)于MVP(Model View Presenter),我相信大多數(shù)人都能說(shuō)出一些的,“MVC的演化版本”,“讓Model和View完全解耦”等等,但用過(guò)MVP的人一定會(huì)覺(jué)得,在Android中,代碼很清晰,不過(guò)多了很多類。對(duì)于大多數(shù)人而言,在看MVP的Demo的時(shí)候,一眼便是慢慢的nice,然而讓自己來(lái)寫(xiě)個(gè)例子,卻很頭疼寫(xiě)不出來(lái)。但的確MVC模式寫(xiě)起來(lái)更加像是順?biāo)浦邸V恍枰炎约旱臉I(yè)務(wù)邏輯一股腦的放進(jìn)Activity就成功完事兒。

不得不說(shuō),之前我們項(xiàng)目中的確也是用的MVC在編寫(xiě)的。很簡(jiǎn)單的會(huì)發(fā)現(xiàn)隨便一個(gè)Activity代碼都是幾百上千行,甚至還有一萬(wàn)行以上的。看起來(lái)的確那么一回事兒,但是細(xì)想這個(gè)View對(duì)于布局文件,其實(shí)能做的事情特別少,實(shí)際上關(guān)于該布局文件中的數(shù)據(jù)綁定的操作,事件處理的操作都在Activity中,造成了Activity既想View又像Controller,鄙棄代碼上的不美觀來(lái)說(shuō),對(duì)于后面的閱讀代碼真的是吃力。

不信?你瞧瞧。

也許業(yè)務(wù)邏輯比較簡(jiǎn)單的功能用MVC沒(méi)什么,但是想沒(méi)想過(guò),如果你產(chǎn)品后面改需求怎么辦?是的,你接受產(chǎn)品需求的強(qiáng)奸,但還是只有忍辱偷生。在日漸復(fù)雜的業(yè)務(wù)邏輯上,你的Activity和Fragment代碼越來(lái)越多,最終導(dǎo)致代碼爆炸,難以維護(hù)。

網(wǎng)上瀏覽一圈,發(fā)現(xiàn)講MVP的文章比比皆是,可見(jiàn)MVP的歡迎度,但大多數(shù)文章都只是講理論,稍微好點(diǎn)的會(huì)附帶一個(gè)簡(jiǎn)單的登錄的Demo。然而,一個(gè)簡(jiǎn)單的demo很難讓初次接觸MVP模式的人掌握它的使用。所以愛(ài)吖妹紙應(yīng)運(yùn)而生。

什么是MVP

當(dāng)然不能跑題,前面對(duì) MVP 做了簡(jiǎn)單的概述,下面還是用一個(gè)簡(jiǎn)單的圖表示一下。

 

如上圖所示,在項(xiàng)目中 View 和 Model 并不直接交互,而是使用 Presenter 作為 View 和 Model 之間的橋梁。其中 Presenter 中同時(shí)持有 View 層以及 Model 層的 Interface 的引用,而 View 層持有 Presenter 層 Interface 的引用,當(dāng) View 層某個(gè)頁(yè)面需要展示某些數(shù)據(jù)的時(shí)候,首先會(huì)調(diào)用Presenter 層的某個(gè)接口,然后 Presenter 層會(huì)調(diào)用 Model 層請(qǐng)求數(shù)據(jù),當(dāng) Model 層數(shù)據(jù)加載成功之后會(huì)調(diào)用 Presenter 層的回調(diào)方法通知 Presenter 層數(shù)據(jù)加載完畢,*** Presenter 層再調(diào)用 View 層的接口將加載后的數(shù)據(jù)展示給用戶。這就是 MVP 模式的核心過(guò)程。

這樣分層的好處就是大大減少了Model與View層之間的耦合度。一方面可以使得View層和Model層單獨(dú)開(kāi)發(fā)與測(cè)試,互不依賴。另一方面Model層可以封裝復(fù)用,可以極大的減少代碼量。當(dāng)然,MVP還有其他的一些優(yōu)點(diǎn),這里不再贅述。

功能展示

這里就給大家隨便看看干貨板塊的功能吧。

布局相當(dāng)簡(jiǎn)單。

  1. <android.support.v4.widget.SwipeRefreshLayout 
  2.     xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     xmlns:app="http://schemas.android.com/apk/res-auto" 
  4.     android:id="@+id/swipe_refresh_layout" 
  5.     android:layout_width="match_parent" 
  6.     android:layout_height="match_parent"
  7.  
  8.     <com.nanchen.aiyagirl.widget.RecyclerViewWithFooter.RecyclerViewWithFooter 
  9.         android:id="@+id/recyclerView" 
  10.         android:layout_width="match_parent" 
  11.         android:layout_height="match_parent"/> 
  12.  
  13. </android.support.v4.widget.SwipeRefreshLayout>  

干貨模塊,也就是一個(gè)Fragment,里面有一個(gè)RecyclerView,支持下拉刷新和上拉加載數(shù)據(jù)。所以我們的 Presenter 和 View 只需要定義一下簡(jiǎn)單的方法。

1)加載數(shù)據(jù)的過(guò)程中顯示加載的進(jìn)度條;

2)加載數(shù)據(jù)成功提醒 Adapter 刷新數(shù)據(jù);

3)加載失敗談窗提醒用戶相關(guān)信息;

4)加載結(jié)束隱藏進(jìn)度條;

  1. public interface CategoryContract {     
  2.     interface ICategoryView extends BaseView{  
  3.         void getCategoryItemsFail(String failMessage);         
  4.         void setCategoryItems(CategoryResult categoryResult);         
  5.         void addCategoryItems(CategoryResult categoryResult);         
  6.         void showSwipeLoading();         
  7.         void hideSwipeLoading();         
  8.         void setLoading();         
  9.         String getCategoryName();         
  10.         void noMore(); 
  11.     }    interface ICategoryPresenter extends BasePresenter{         
  12.         void getCategoryItems(boolean isRefresh); 
  13.     } 
  14.  

編寫(xiě) Presenter 實(shí)現(xiàn)類。

  1. public class CategoryPresenter implements ICategoryPresenter {     
  2. private ICategoryView mCategoryICategoryView;     
  3. private int mPage = 1;     
  4. private Subscription mSubscription;     
  5. public CategoryPresenter(ICategoryView androidICategoryView) { 
  6.         mCategoryICategoryView = androidICategoryView; 
  7.     }     
  8.     @Override 
  9.     public void subscribe() { 
  10.         getCategoryItems(true); 
  11.     }     
  12.     @Override 
  13.     public void unSubscribe() {         
  14.         if (mSubscription != null  && !mSubscription.isUnsubscribed()){ 
  15.             mSubscription.unsubscribe(); 
  16.         } 
  17.     }    @Override 
  18.     public void getCategoryItems(final boolean isRefresh) {         
  19.         if (isRefresh) { 
  20.             mPage = 1; 
  21.             mCategoryICategoryView.showSwipeLoading(); 
  22.         } else { 
  23.             mPage++; 
  24.         } 
  25.         mSubscription = NetWork.getGankApi() 
  26.                 .getCategoryData(mCategoryICategoryView.getCategoryName(), GlobalConfig.CATEGORY_COUNT,mPage) 
  27.                 .subscribeOn(Schedulers.io()) 
  28.                 .observeOn(AndroidSchedulers.mainThread()) 
  29.                 .subscribe(new Observer<CategoryResult>() {                     
  30.                     @Override 
  31.                     public void onCompleted() { 
  32.  
  33.                     }                     
  34.                     @Override 
  35.                     public void onError(Throwable e) { 
  36.                         mCategoryICategoryView.hideSwipeLoading(); 
  37.                         mCategoryICategoryView.getCategoryItemsFail(mCategoryICategoryView.getCategoryName()+" 列表數(shù)據(jù)獲取失敗!"); 
  38.                     }                     
  39.                     @Override 
  40.                     public void onNext(CategoryResult categoryResult) {                         
  41.                         if (isRefresh){ 
  42.                             mCategoryICategoryView.setCategoryItems(categoryResult); 
  43.                             mCategoryICategoryView.hideSwipeLoading(); 
  44.                             mCategoryICategoryView.setLoading(); 
  45.                         }else { 
  46.                             mCategoryICategoryView.addCategoryItems(categoryResult); 
  47.                         } 
  48.                     } 
  49.                 }); 
  50.     } 
  51.  

編寫(xiě)Adapter,用于展示數(shù)據(jù)。

  1. class CategoryRecyclerAdapter extends CommonRecyclerAdapter<CategoryResult.ResultsBean> implements  
  2. ListenerWithPosition.OnClickWithPositionListener<CommonRecyclerHolder>{ 
  3.  
  4.     CategoryRecyclerAdapter(Context context) {         
  5.         super(context, null, R.layout.item_category); 
  6.     }    @Override 
  7.     public void convert(CommonRecyclerHolder holder, ResultsBean resultsBean) {         
  8.         if (resultsBean != null) {             
  9.         ImageView imageView = holder.getView(R.id.category_item_img);             
  10.         if (ConfigManage.INSTANCE.isListShowImg()) { // 列表顯示圖片 
  11.                 imageView.setVisibility(View.VISIBLE);                 
  12.             String quality = "";                 
  13.             if (resultsBean.images != null && resultsBean.images.size() > 0) { 
  14.                     switch (ConfigManage.INSTANCE.getThumbnailQuality()) {                         
  15.                         case 0: // 原圖 
  16.                             quality = "";                             
  17.                             break;                         
  18.                         case 1: // 
  19.                             quality = "?imageView2/0/w/400";                             
  20.                             break;                         
  21.                         case 2: 
  22.                             quality = "?imageView2/0/w/190";                             
  23.                             break; 
  24.                     }                     
  25.                     Glide.with(mContext) 
  26.                             .load(resultsBean.images.get(0) + quality) 
  27.                             .placeholder(R.mipmap.image_default) 
  28.                             .error(R.mipmap.image_default) 
  29.                             .into(imageView); 
  30.                 } else { // 列表不顯示圖片 
  31.                     Glide.with(mContext).load(R.mipmap.image_default).into(imageView); 
  32.                 } 
  33.             } else { 
  34.                 imageView.setVisibility(View.GONE); 
  35.             } 
  36.  
  37.             holder.setTextViewText(R.id.category_item_desc, resultsBean.desc == null ? "unknown" : resultsBean.desc); 
  38.             holder.setTextViewText(R.id.category_item_author, resultsBean.who == null ? "unknown" : resultsBean.who); 
  39.             holder.setTextViewText(R.id.category_item_time, TimeUtil.dateFormat(resultsBean.publishedAt)); 
  40.             holder.setTextViewText(R.id.category_item_src, resultsBean.source == null ? "unknown" : resultsBean.source); 
  41.             holder.setOnClickListener(this, R.id.category_item_layout); 
  42.         } 
  43.     }    @Override 
  44.     public void onClick(View v, int position, CommonRecyclerHolder holder) { 
  45.         //Toasty.info(mContext,"跳轉(zhuǎn)到相應(yīng)網(wǎng)頁(yè)!", Toast.LENGTH_SHORT,true).show(); 
  46.         Intent intent = new Intent(mContext, WebViewActivity.class); 
  47.         intent.putExtra(WebViewActivity.GANK_TITLE, mData.get(position).desc); 
  48.         intent.putExtra(WebViewActivity.GANK_URL, mData.get(position).url); 
  49.         mContext.startActivity(intent); 
  50.     } 
  51.  

***當(dāng)然是 Fragment。

  1. public class CategoryFragment extends BaseFragment implements ICategoryView, OnRefreshListener, OnLoadMoreListener {     
  2. public static final String CATEGORY_NAME = "com.nanchen.aiyagirl.module.category.CategoryFragment.CATEGORY_NAME";     
  3. @BindView(R.id.recyclerView) 
  4.     RecyclerViewWithFooter mRecyclerView;     
  5.     @BindView(R.id.swipe_refresh_layout) 
  6.     SwipeRefreshLayout mSwipeRefreshLayout;     
  7.         private String categoryName;     
  8.         private CategoryRecyclerAdapter mAdapter;     
  9.         private ICategoryPresenter mICategoryPresenter;     
  10.         public static CategoryFragment newInstance(String mCategoryName) { 
  11.         CategoryFragment categoryFragment = new CategoryFragment(); 
  12.         Bundle bundle = new Bundle(); 
  13.         bundle.putString(CATEGORY_NAME, mCategoryName); 
  14.         categoryFragment.setArguments(bundle);         
  15.         return categoryFragment; 
  16.     }    @Override 
  17.     protected int getContentViewLayoutID() {         
  18.         return R.layout.fragment_category; 
  19.     }    @Override 
  20.     protected void init() { 
  21.         mICategoryPresenter = new CategoryPresenter(this); 
  22.         categoryName = getArguments().getString(CATEGORY_NAME); 
  23.         mSwipeRefreshLayout.setOnRefreshListener(this); 
  24.         mAdapter = new CategoryRecyclerAdapter(getActivity()); 
  25.         mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
  26.         mRecyclerView.addItemDecoration(new RecyclerViewDivider(getActivity(), LinearLayoutManager.HORIZONTAL)); 
  27.         mRecyclerView.setAdapter(mAdapter); 
  28.         mRecyclerView.setOnLoadMoreListener(this); 
  29.         mRecyclerView.setEmpty(); 
  30.         mICategoryPresenter.subscribe(); 
  31.     }    @Override 
  32.     public void onDestroy() {         
  33.         super.onDestroy();         
  34.         if (mICategoryPresenter != null) { 
  35.             mICategoryPresenter.unSubscribe(); 
  36.         } 
  37.     }    @Override 
  38.     public void onRefresh() { 
  39.         mICategoryPresenter.getCategoryItems(true); 
  40.     }    @Override 
  41.     public void onLoadMore() { 
  42.         mICategoryPresenter.getCategoryItems(false); 
  43.     }    @Override 
  44.     public void getCategoryItemsFail(String failMessage) {         
  45.         if (getUserVisibleHint()) { 
  46.             Toasty.error(this.getContext(), failMessage).show(); 
  47.         } 
  48.     }    @Override 
  49.     public void setCategoryItems(CategoryResult categoryResult) { 
  50.         mAdapter.setData(categoryResult.results); 
  51.     }    @Override 
  52.     public void addCategoryItems(CategoryResult categoryResult) { 
  53.         mAdapter.addData(categoryResult.results); 
  54.  
  55.     }    @Override 
  56.     public void showSwipeLoading() { 
  57.         mSwipeRefreshLayout.setRefreshing(true); 
  58.     }    @Override 
  59.     public void hideSwipeLoading() { 
  60.         mSwipeRefreshLayout.setRefreshing(false); 
  61.     }    @Override 
  62.     public void setLoading() { 
  63.         mRecyclerView.setLoading(); 
  64.     }    @Override 
  65.     public String getCategoryName() {         
  66.         return this.categoryName; 
  67.     }    @Override 
  68.     public void noMore() { 
  69.         mRecyclerView.setEnd("沒(méi)有更多數(shù)據(jù)"); 
  70.     } 
  71.  

項(xiàng)目截圖

還是給大家看看項(xiàng)目截圖,以免大家心慌。

    

 

結(jié)束語(yǔ)

愛(ài)吖妹紙是運(yùn)用 MVP,Retrofit,RxJava 等主流框架整合的干貨 App,項(xiàng)目資源來(lái)源于代碼家的干貨集中營(yíng)。代碼量不多,但基本涉及了各個(gè)方面,界面采用design風(fēng)格,所以也是學(xué)習(xí)design的良藥。作者也是希望繼續(xù)在開(kāi)源路上越走越遠(yuǎn),還請(qǐng)大家支持。

責(zé)任編輯:龐桂玉 來(lái)源: 安卓巴士Android開(kāi)發(fā)者門(mén)戶
相關(guān)推薦

2010-07-22 14:59:24

SQL Server

2021-08-02 19:39:51

網(wǎng)絡(luò)測(cè)試路由器

2010-08-06 13:26:29

DB2建立databa

2010-05-27 16:55:23

操作MySQL

2010-06-07 14:57:57

2010-08-17 11:35:00

2010-06-18 09:08:29

SQL Server

2010-08-03 16:54:10

DB2 9.5

2012-09-25 09:28:36

程序員代碼代碼整潔

2024-09-25 14:16:35

2022-10-31 07:09:15

拷貝代碼項(xiàng)目

2020-07-15 08:37:11

JavaScript開(kāi)發(fā)技術(shù)

2012-06-20 13:36:42

Surface平板

2020-05-07 10:18:06

JavaScript前端技術(shù)

2019-07-10 10:20:36

前端用戶體驗(yàn)javascript

2019-04-04 14:05:20

consolejs前端

2022-08-29 18:34:46

Pythonsubprocess系統(tǒng)

2025-09-30 01:11:00

AISLED場(chǎng)景

2025-04-29 10:04:41

JavaScripMap代碼
點(diǎn)贊
收藏

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

激情小说欧美色图| 一区二区三区欧美成人| 国产91精品一区| 欧美日韩精品在线一区| 8v天堂国产在线一区二区| 久久综合亚洲精品| 男女污污视频在线观看| 精品在线一区二区三区| 久久久人成影片一区二区三区观看 | 国产精品人人做人人爽| 黄色片在线观看网站| 婷婷综合一区| 欧美一级二级三级蜜桃| 国产又大又硬又粗| 日本乱理伦在线| 国产精品无圣光一区二区| 国产日产精品一区二区三区四区 | 久久三级视频| 欧美人成在线视频| 香蕉成人在线视频| 妖精一区二区三区精品视频| 日韩午夜激情免费电影| 国产野外作爱视频播放| 操人在线观看| 一区二区三区四区蜜桃| 亚洲欧美日本国产有色| 人妻视频一区二区三区| 激情深爱一区二区| 国产精品久久久久999| 国产成人免费观看视频 | 波多野结衣家庭教师在线播放| 爱久久·www| 久久这里只有精品6| 国产成人成网站在线播放青青| 日韩不卡高清视频| 美女国产精品| 国外成人免费在线播放| 欧美日韩在线观看成人| 91综合久久一区二区| 亚洲一二三在线| 欧美做受喷浆在线观看| aaa国产精品视频| 日韩欧美资源站| 一级黄色片在线免费观看| 久久精品97| 欧美午夜宅男影院| 搡女人真爽免费午夜网站| 午夜影视一区二区三区| 午夜精品久久久久久久99樱桃| 欧洲美女和动交zoz0z| 黄色免费在线网站| 自拍偷拍亚洲欧美日韩| 9l视频自拍9l视频自拍| 国产剧情在线| 亚洲女爱视频在线| 日本一道在线观看| 影音先锋男人资源在线| 一区二区三区高清不卡| 日韩久久久久久久久久久久| 五月婷婷视频在线观看| 亚洲综合色在线| 日本一区午夜艳熟免费| 91桃色在线| 欧美体内谢she精2性欧美| 91成人在线观看喷潮教学| 免费看男女www网站入口在线| 婷婷成人综合网| 青青青国产在线观看| 性xxxxfreexxxxx欧美丶| 欧美性猛交xxxx免费看漫画| 1024精品视频| av久久网站| 欧美日韩在线播放一区| 天堂中文av在线| 91成人短视频| 日韩精品视频中文在线观看| 欧美多人猛交狂配| 欧美xxav| 久久久久久久999| 久久人妻免费视频| 麻豆精品视频在线| 高清不卡日本v二区在线| 深夜福利视频在线观看| 中文字幕国产一区| 日韩久久久久久久久久久久| 日本在线影院| 欧美老女人在线| 丰满岳乱妇一区二区| 国产伦精品一区二区三区千人斩| 中国日韩欧美久久久久久久久 | 欧美性猛交xxxx乱大交极品| 国产一级特黄a大片免费| 国产精品久久免费视频| 亚洲精品国产精品乱码不99按摩| 精品人妻无码一区二区三区| 国产精品传媒精东影业在线| 性欧美视频videos6一9| 中文字幕日日夜夜| 成人av电影在线观看| 欧美性天天影院| 18+视频在线观看| 色视频成人在线观看免| 亚洲成人福利视频| 日本道不卡免费一区| 孩xxxx性bbbb欧美| 91久久国语露脸精品国产高跟| 成人午夜电影久久影院| 亚洲欧洲精品在线| 欧产日产国产精品视频| 欧美一级高清片在线观看| 91中文字幕永久在线| 国产精品激情电影| 91精品免费看| 国产一二三在线观看| 亚洲一区二区三区四区在线免费观看| 天天碰免费视频| 日韩欧美在线精品| 久久久久久久久国产| 国产精品一区二区av白丝下载 | 国产成人福利片| 亚洲欧美日韩国产yyy| 在线能看的av网址| 精品国精品自拍自在线| 91 在线视频| 日本午夜一本久久久综合| 狠狠久久综合婷婷不卡| 日韩特级毛片| 日韩精品资源二区在线| 中文字幕无码日韩专区免费 | 日本黄色一级网站| 日韩精品一区二区久久| 国产a级全部精品| 日本一二三区在线视频| 五月天一区二区三区| 中文字幕亚洲日本| 中文在线播放一区二区| 日产日韩在线亚洲欧美| 国产www视频| 亚洲男人电影天堂| 男女污污视频网站| 1024精品久久久久久久久| 国产主播喷水一区二区| 91看片在线观看| 欧美色图一区二区三区| 一级片久久久久| 日韩av不卡在线观看| 日韩黄色影视| 国产精品无码久久久久| 最近的2019中文字幕免费一页 | 精品国产一区二区三区久久影院| 国产成人av免费在线观看| 精品一区二区三区视频在线观看| 亚洲国产精品www| 深夜日韩欧美| 成年无码av片在线| 亚洲精品18在线观看| 亚洲国产日韩一级| 亚洲男人在线天堂| 亚洲欧美网站| 日本在线观看一区二区三区| 中文另类视频| 久久国产一区二区三区| 99热在线只有精品| 亚洲国产wwwccc36天堂| 一起草在线视频| 日韩不卡手机在线v区| 亚洲精美视频| 麻豆一区在线| 亚州精品天堂中文字幕| 精品三级久久久久久久电影聊斋| 91福利精品视频| 91麻豆精品成人一区二区| 极品少妇xxxx精品少妇| 精品国产一区二区三区无码| 精品人人人人| 国产精品第三页| 2020国产在线视频| 日韩av在线免费看| 自拍偷拍第八页| 亚洲精品菠萝久久久久久久| 久久午夜夜伦鲁鲁片| 日日夜夜免费精品| 无码毛片aaa在线| 欧美福利在线播放网址导航| 日本精品久久中文字幕佐佐木| av在线电影观看| 欧美va亚洲va香蕉在线| 亚洲永久精品在线观看| 中文字幕在线一区免费| 国产老熟女伦老熟妇露脸| 丝袜诱惑亚洲看片| 波多野结衣 作品| 免费av一区二区三区四区| 成人美女免费网站视频| a国产在线视频| 色婷婷综合成人av| 天天干视频在线观看| 欧美喷水一区二区| 天天综合网入口| 亚洲乱码国产乱码精品精的特点| 西西大胆午夜视频| 精品一区二区三区在线播放视频| 免费一级特黄毛片| 国产精品99久久| 欧美xxxx黑人又粗又长密月| 激情久久免费视频| 国产成人精品亚洲精品| 99在线视频影院| 久久精品99国产精品酒店日本| 日本黄色一区二区三区| 制服.丝袜.亚洲.另类.中文| xxxx.国产| 亚洲一区二区三区视频在线 | 四季av在线一区二区三区| 国产综合 伊人色| 日韩视频在线直播| 国产拍精品一二三| 欧美成a人片在线观看久| 欧美精品久久一区二区| 一级毛片视频在线| 亚洲天堂免费在线| 亚洲人成色777777精品音频| 欧美一级视频精品观看| 中文字幕一区二区人妻痴汉电车| 精品国产乱码久久久久久天美| 好吊色视频在线观看| 亚洲天堂免费在线观看视频| 韩国三级hd中文字幕| 91视视频在线观看入口直接观看www| 99精品视频免费版的特色功能| 日韩精品一级二级| 免费在线观看毛片网站| 国产日韩欧美三区| 久久综合色视频| 尤物在线精品| 日本手机在线视频| 黄色成人在线网址| 成年人网站国产| 黄色成人91| 日本福利视频一区| 亚洲巨乳在线| 久久久久久人妻一区二区三区| 欧美日韩hd| 成人国产一区二区三区| 午夜欧美精品久久久久久久| 影音先锋成人资源网站| 一区二区在线影院| www婷婷av久久久影片| 欧美三级黄美女| 国产欧美精品aaaaaa片| 黄色国产精品| 成人在线观看你懂的| 一区二区三区福利| avav在线看| 青青草97国产精品免费观看 | 国产精品国产三级国产aⅴ无密码| 久久只有这里有精品| 国产亚洲一区二区在线观看| 女人十八毛片嫩草av| 国产精品污www在线观看| 女教师淫辱の教室蜜臀av软件| 国产精品护士白丝一区av| 秋霞欧美一区二区三区视频免费| 亚洲色图欧洲色图| 久久久一二三区| 日韩欧中文字幕| 精品乱码一区内射人妻无码| 欧美精品一二三| 亚洲精品18p| 亚洲免费一在线| 日本三级在线播放完整版| 欧美裸体xxxx极品少妇| 91超碰在线| 国产精品mp4| 95精品视频| 狠狠色综合色区| 亚洲视频分类| 日本黄色a视频| 亚洲国产综合在线看不卡| 欧美精品色婷婷五月综合| 麻豆国产精品视频| 久久久久99人妻一区二区三区| 26uuu国产一区二区三区| 国产无遮挡在线观看| 亚洲卡通欧美制服中文| 欧美三级韩国三级日本三斤在线观看| 91久久精品日日躁夜夜躁欧美| 一级黄色大片网站| 亚洲成色777777女色窝| yw193.com尤物在线| 欧美第一页在线| 亚洲成人短视频| 99久久伊人精品影院| 国产一区国产二区国产三区| 三年中国中文在线观看免费播放| 日韩网站在线| theporn国产精品| 久久综合久久综合九色| 暗呦丨小u女国产精品| 欧美日韩激情小视频| 国产精品怡红院| 亚洲视频在线观看网站| 高清电影在线免费观看| 国产精品男女猛烈高潮激情| 盗摄牛牛av影视一区二区| 天堂av一区二区| 亚洲美女网站| 日本中文字幕精品| 国产精品美女久久久久久久久久久 | 在线观看免费黄视频| 国产91精品不卡视频| 伊人精品久久| 一区二区精品在线观看| 久久xxxx| 女同性恋一区二区三区| 亚洲色图一区二区三区| 中文字幕乱码视频| 亚洲精品中文字幕av| bl视频在线免费观看| 91久久嫩草影院一区二区| 精品av一区二区| 久久精品免费一区二区| 成人av动漫在线| 国产网站在线看| 日韩欧美一级片| 在线视频观看国产| 成人免费午夜电影| 天天射成人网| 自拍偷拍21p| 中日韩免费视频中文字幕| 国产成人无码专区| 亚洲人成网站色ww在线| 这里有精品可以观看| 精品久久久久久亚洲| 亚洲高清久久| 中文字幕无码人妻少妇免费| 一区二区三区日本| 性做久久久久久久| 欧美成人在线免费| 亚洲日本视频在线| www.在线观看av| 成人激情午夜影院| 中文字幕一区二区三区精品 | 在线看黄色av| 国产精品一区二区三区在线播放 | 精品精品国产毛片在线看| 亚洲色成人www永久在线观看| 国产成人av资源| 国产无遮挡又黄又爽在线观看| 日韩精品专区在线影院观看| 国内高清免费在线视频| 国产精品加勒比| 一区二区黄色| 91精品人妻一区二区三区| 欧美亚洲综合久久| 日日夜夜精品一区| 91丨九色丨国产在线| 欧美激情视频一区二区三区在线播放 | 欧美大片在线播放| 国产日韩影视精品| 91精品中文字幕| 久久99亚洲热视| 欧洲vs亚洲vs国产| 成人3d动漫一区二区三区| 国产精品国产馆在线真实露脸| 国产手机精品视频| 久久久噜噜噜久久中文字免| 一区二区小说| 欧美激情第3页| 亚洲一级不卡视频| 日本aaa在线观看| 成人免费福利在线| 一区视频在线看| 午夜在线观看一区| 欧美一三区三区四区免费在线看 | 一本色道久久综合亚洲精品不卡 | 亚洲视频 欧洲视频| 亚洲乱色熟女一区二区三区| 91福利视频在线观看| jizzjizz欧美69巨大| 无码人妻一区二区三区在线视频| 精品久久久久国产| 在线国产91| 久久久一本精品99久久精品| 开心九九激情九九欧美日韩精美视频电影| 91香蕉一区二区三区在线观看| 精品国产一区二区三区不卡 | 日本午夜一区二区| 精品一区二区三区四| 夜夜嗨av色一区二区不卡| 亚洲一区二区三区免费| 中文字幕乱码人妻综合二区三区| 国产精品国产成人国产三级| 天天操天天操天天| 91精品国产综合久久久久久蜜臀| 亚洲国产专区| 欧美黄色aaa| 中文综合在线观看| 亚洲婷婷丁香| 亚洲性图第一页|