国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Jetpack 組件之 ViewModel 使用與淺析

共 31682字,需瀏覽 64分鐘

 ·

2021-06-25 15:58

ViewModel 是什么?

官方解釋:

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.

個人理解:
ViewModel 是 UI 和數(shù)據(jù)的橋接層,承擔(dān) UI 層(Activity / Fragment) 的數(shù)據(jù)處理邏輯,同時擁有維護自己的生命周期,而且可以在屏幕旋轉(zhuǎn)時仍保存數(shù)據(jù)。下面是官方提供的一張屏幕旋轉(zhuǎn)時 ViewModel 的生命周期圖。

怎么使用 ViewModel?

這里以 Activity 中使用為例。

  1. 自定義 ViewModel 類,繼承自 ViewModel。該類將用作數(shù)據(jù)處理,并返回數(shù)據(jù)給UI
// 這里僅是示例,推薦結(jié)合 LiveData 一起使用。
class CustomViewModelViewMdoel(){
    private val data: List<String> = mutableListOf()
    
    fun getData(): List<String> {
        retrun data
    }
}
  1. 在 Activity 中獲取自定義的 ViewModel 類,調(diào)用相應(yīng)方法獲取處理后的數(shù)據(jù)
//這里以 Activity 示例,F(xiàn)ragment 類似。
class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
    
        // 通過ktx 獲取自定義 ViewModel 類
        // 需要添加依賴 implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:$viewmodel_version'
        //val viewModel: CustomViewModel by viewModels()
        
        // 通過“傳統(tǒng)方式” 獲取自定義 ViewModel 類
        val viewModel = ViewModelProvider(this).get(CustomViewModel::class.java)
        
        //獲取數(shù)據(jù),實現(xiàn)后續(xù)UI邏輯
        val data = viewModel.getData()
    }
}

ViewModel 的原理是什么?

原理僅講解 Activity 部分。源碼部分基于 lifecycle 2.2.0 版本 與 acitivity 1.1.0 版本。

源碼分析分為兩部分,先從調(diào)用方法出發(fā),大體知道內(nèi)部邏輯,再從疑問入手,解答心里疑惑。

實現(xiàn)原理

從調(diào)用方法出發(fā)

//通過 ViewModelProvider#get() 獲取自定義 ViewModel 對象,然后就可以調(diào)用相關(guān)方法
ViewModelProvider(this).get(CustomViewModel::class.java)

通過調(diào)用方法可以發(fā)現(xiàn),需要了解下 ViewModelProvider() 和 get() 方法的內(nèi)部實現(xiàn)。

ViewModelProvider() 內(nèi)部實現(xiàn):

public class ViewModelProvider {

    private final Factory mFactory;
    private final ViewModelStore mViewModelStore;

    // ... 省略 ...

    // 入?yún)?nbsp;ViewModelStoreOwner,通過 owner 獲取 ViewModelStore 和 ViewModelFactory
    public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
        this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
            ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
            : NewInstanceFactory.getInstance());
    }

    /**
     * Creates {@code ViewModelProvider}, which will create {@code ViewModels} via the given
     * {@code Factory} and retain them in the given {@code store}.
     *
     * @param store   {@code ViewModelStore} where ViewModels will be stored.
     * @param factory factory a {@code Factory} which will be used to instantiate
     *                new {@code ViewModels}
     */

    public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
        mFactory = factory;
        mViewModelStore = store;
    }

    // ... 省略 ...
}

通過上面代碼可以發(fā)現(xiàn),ViewModelProvider 內(nèi)部維護的 ViewModelStore 和 Factory 都是通過傳入的 owner 創(chuàng)建的。根據(jù)調(diào)用傳入的 this 可以知道,此時的owner 為 Activity,那么看下 Activity 中是怎么實現(xiàn)創(chuàng)建的。

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory 
{

     // ... 省略 ...

    @NonNull
    @Override
    public ViewModelStore getViewModelStore() {
        // ... 省略 ...
        
        if (mViewModelStore == null) {
            // 從上次配置發(fā)生更改(例如屏幕旋轉(zhuǎn))中獲取
            NonConfigurationInstances nc =
                   (NonConfigurationInstances) getLastNonConfigurationInstance();
            if (nc != null) {
                mViewModelStore = nc.viewModelStore;
            }
            if (mViewModelStore == null) {
                // 直接創(chuàng)建
                // ViewModelStore 內(nèi)部只有一個 Map 來存儲創(chuàng)建的 ViewModel
                mViewModelStore = new ViewModelStore();
            }
        }
        return mViewModelStore;
    }

    // ... 省略 ...

    @NonNull
    @Override
    public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
        // ... 省略 ...
        
        // 這里判斷是否有創(chuàng)建過,沒有則直接創(chuàng)建。
        if (mDefaultFactory == null) {
            mDefaultFactory = new SavedStateViewModelFactory(
                    getApplication(),
                    this,
                    getIntent() != null ? getIntent().getExtras() : null);
        }
        return mDefaultFactory;
    }

    // ... 省略 ...
}

通過上面代碼可以知道,ComponentActivity 實現(xiàn) ViewModelStoreOwner 和 HasDefaultViewModelProviderFactory 接口,分別創(chuàng)建了 ViewModelStore 和 SavedStateViewModelFactory 對象。ViewModelStore 內(nèi)部維護了一個Map,用于存儲創(chuàng)建的 ViewModel。SavedStateViewModelFactory 內(nèi)部是維護了 ViewModel 的創(chuàng)建,是一個工廠類。Ok,ViewModelProvider 構(gòu)造函數(shù)的內(nèi)部邏輯到此為止。

ViewModelProvider#get() 內(nèi)部實現(xiàn):

public class ViewModelProvider {

    private static final String DEFAULT_KEY =
                "androidx.lifecycle.ViewModelProvider.DefaultKey";
    
    private final Factory mFactory;
    private final ViewModelStore mViewModelStore;
    
    // ... 省略 ...

    @NonNull
    @MainThread
    public <T extends ViewModel> get(@NonNull Class<T> modelClass) {
        String canonicalName = modelClass.getCanonicalName();
        if (canonicalName == null) {
            throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
        }
        return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
    }

    @NonNull
    @MainThread
    public <T extends ViewModel> get(@NonNull String key, @NonNull Class<T> modelClass) {
        //從緩存中獲取
        ViewModel viewModel = mViewModelStore.get(key);

        if (modelClass.isInstance(viewModel)) {
            if (mFactory instanceof OnRequeryFactory) {
                ((OnRequeryFactory) mFactory).onRequery(viewModel);
            }
            return (T) viewModel;
        } else {
            //noinspection StatementWithEmptyBody
            if (viewModel != null) {
                // TODO: log a warning.
            }
        }
        
        // 緩存沒有,則進行創(chuàng)建。
        // 根據(jù)上面 "ViewModelProvider() 內(nèi)部實現(xiàn)" 可以得知,mFactory = new SavedStateViewModelFactory(),
        // 而 SavedStateViewModelFactory 實現(xiàn)的 ViewModelProvider.KeyedFactory 接口。
        // 所以此時 (mFactory instanceof KeyedFactory) = true
        if (mFactory instanceof KeyedFactory) {
            viewModel = ((KeyedFactory) (mFactory)).create(key, modelClass);
        } else {
            viewModel = (mFactory).create(modelClass);
        }
        // 將新創(chuàng)建的 ViewModel 存入緩存中
        mViewModelStore.put(key, viewModel);
        return (T) viewModel;
    }
    
    // ... 省略 ...
}

通過上面代碼可以得知,get() 方法內(nèi)部先從 ViewModelStore 中獲取是否已經(jīng)創(chuàng)建過,如果沒有創(chuàng)建過,則通過 SavedStateViewModelFactory#create() 方法創(chuàng)建,并將新創(chuàng)建的 ViewModel 存入 ViewModelStore 中。
那么接下來就看下 SavedStateViewModelFactory#create() 內(nèi)部實現(xiàn)。

public final class SavedStateViewModelFactory extends ViewModelProvider.KeyedFactory {

    private final Application mApplication;
    private final ViewModelProvider.AndroidViewModelFactory mFactory;
    private final Bundle mDefaultArgs;
    private final Lifecycle mLifecycle;
    private final SavedStateRegistry mSavedStateRegistry;
    
    // ... 省略 ...
    
    @SuppressLint("LambdaLast")
    public SavedStateViewModelFactory(@NonNull Application application,
            @NonNull SavedStateRegistryOwner owner,
            @Nullable Bundle defaultArgs)
 
{
        mSavedStateRegistry = owner.getSavedStateRegistry();
        mLifecycle = owner.getLifecycle();
        mDefaultArgs = defaultArgs;
        mApplication = application;
        mFactory = ViewModelProvider.AndroidViewModelFactory.getInstance(application);
    }
    
    @NonNull
    @Override
    public <T extends ViewModel> create(@NonNull String key, @NonNull Class<T> modelClass) {
        // 判斷是否ViewModel繼承自 AndroidViewModel,由于咱們自定義的 ViewModel 繼承自 ViewModel,所以這里不成立
        boolean isAndroidViewModel = AndroidViewModel.class.isAssignableFrom(modelClass);
        Constructor<T> constructor;
        if (isAndroidViewModel) {
            constructor = findMatchingConstructor(modelClass, ANDROID_VIEWMODEL_SIGNATURE);
        } else {
            // 內(nèi)部判斷傳入的 Class 構(gòu)造函數(shù)是否包含指定參數(shù)。
            // 此時咱們自定義的 ViewModel 構(gòu)造函數(shù)未包含所有任何參數(shù),所以這里返回 null
            constructor = findMatchingConstructor(modelClass, VIEWMODEL_SIGNATURE);
        }
      
        if (constructor == null) {
            // 通過上面步驟可以的值,最后調(diào)用 mFactory#create() 進行創(chuàng)建。
            return mFactory.create(modelClass);
        }

        // ... 省略 ...
    }
    
    // ... 省略 ...
}    

通過上面代碼可以發(fā)現(xiàn),SavedStateViewModelFactory#create() 內(nèi)部做了一些校驗,但是咱們自定義的 ViewModel 都沒有滿足,最后通過 ViewModelProvider.AndroidViewModelFactory.getInstance(application)#create() 來創(chuàng)建。那么就看看 AndroidViewModelFactory#create() 內(nèi)部實現(xiàn)。

public class ViewModelProvider {
    // ... 省略 ...
    
    public static class AndroidViewModelFactory extends ViewModelProvider.NewInstanceFactory {
        // ... 省略 ...
    
        @NonNull
        @Override
        public <T extends ViewModel> create(@NonNull Class<T> modelClass) {
            // 判斷是否ViewModel繼承自 AndroidViewModel。咱們自定義的 ViewModel 繼承自 ViewModel。
            // 所以最后調(diào)用 super.create(),即 ViewModelProvider.NewInstanceFactory#create()
            if (AndroidViewModel.class.isAssignableFrom(modelClass)) {
                try {
                    return modelClass.getConstructor(Application.class).newInstance(mApplication);
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException("Cannot create an instance of " + modelClass, e);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("Cannot create an instance of " + modelClass, e);
                } catch (InstantiationException e) {
                    throw new RuntimeException("Cannot create an instance of " + modelClass, e);
                } catch (InvocationTargetException e) {
                    throw new RuntimeException("Cannot create an instance of " + modelClass, e);
                }
            }
            return super.create(modelClass);
        }
    }

    // ... 省略 ...    
    
    public static class NewInstanceFactory implements Factory {
        // ... 省略 ...
    
        @SuppressWarnings("ClassNewInstance")
        @NonNull
        @Override
        public <T extends ViewModel> create(@NonNull Class<T> modelClass) {
            try {
                // 直接通過 Class.newInstance() 進行創(chuàng)建。
                return modelClass.newInstance();
            } catch (InstantiationException e) {
                throw new RuntimeException("Cannot create an instance of " + modelClass, e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException("Cannot create an instance of " + modelClass, e);
            }
        }
    }
    
    // ... 省略 ...
}

通過上面代碼可以知道,AndroidViewModelFactory#create 又進行了校驗,最后調(diào)用到了 NewInstanceFactory#create() 方法,該方法直接通過 Class.newInstance() 創(chuàng)建了 ViewModel。至此,ViewModel 的創(chuàng)建過程就走完了。在文章的最后會對該過程有一個總結(jié)。

從疑問出發(fā)

1. ViewModel 是怎么實現(xiàn)屏幕旋轉(zhuǎn)時仍可保留數(shù)據(jù)的?

關(guān)于屏幕旋轉(zhuǎn)仍可保留數(shù)據(jù)的重點,其實需要知道 Activity#onRetainNonConfigurationInstance(),通過該方法的注釋可以知道,當(dāng)有新配置導(dǎo)致重新創(chuàng)建實例時,系統(tǒng)會通過該方法回調(diào)通知。

public class Activity{

     // ... 省略 ...
    
     /**
     * Called by the system, as part of destroying an
     * activity due to a configuration change, when it is known that a new
     * instance will immediately be created for the new configuration.  You
     * can return any object you like here, including the activity instance
     * itself, which can later be retrieved by calling
     * {@link #getLastNonConfigurationInstance()} in the new activity
     * instance.
     * 
     * ... 省略 ...
     * 
     */

    public Object onRetainNonConfigurationInstance() {
        return null;
    }

    // ... 省略 ...
}

ComponentActivity 重寫了該方法,當(dāng)屏幕旋轉(zhuǎn)時將 viewModelStore 保存其中,這樣當(dāng)屏幕旋轉(zhuǎn),重新走 getViewModelStore() 時,先通過 getLastNonConfigurationInstances() 方法就可以獲取到之前的 viewModelStore。
PS: 這里需要注意一點,ComponentActivity#onRetainNonConfigurationInstance() 提到了該方法禁止自己重寫!

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory 
{
    // ... 省略 ...
        
    @NonNull
    @Override
    public ViewModelStore getViewModelStore() {
        if (mViewModelStore == null) {
            // 從上次配置發(fā)生更改(例如屏幕旋轉(zhuǎn))中獲取
            NonConfigurationInstances nc =
                    (NonConfigurationInstances) getLastNonConfigurationInstance();
            if (nc != null) {
                mViewModelStore = nc.viewModelStore;
            }
            if (mViewModelStore == null) {
                mViewModelStore = new ViewModelStore();
            }
        }
        return mViewModelStore;
    }
    
    // ... 省略 ...

    /**
     * Retain all appropriate non-config state.  You can NOT
     * override this yourself!  Use a {@link androidx.lifecycle.ViewModel} if you want to
     * retain your own non config state.
     */

    @Override
    @Nullable
    public final Object onRetainNonConfigurationInstance() {
        Object custom = onRetainCustomNonConfigurationInstance();

        ViewModelStore viewModelStore = mViewModelStore;
        if (viewModelStore == null) {
            NonConfigurationInstances nc =
                    (NonConfigurationInstances) getLastNonConfigurationInstance();
            if (nc != null) {
                viewModelStore = nc.viewModelStore;
            }
        }

        if (viewModelStore == null && custom == null) {
            return null;
        }

        NonConfigurationInstances nci = new NonConfigurationInstances();
        nci.custom = custom;
        nci.viewModelStore = viewModelStore;
        return nci;
    }
    
    // ... 省略 ...
}

2. ViewModel 是怎么管理生命周期,在 Activity 銷毀時清理數(shù)據(jù)的?

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory 
{
    // ... 省略 ...

    public ComponentActivity() {
        Lifecycle lifecycle = getLifecycle();
        
        // ... 省略 ...
        
        // 監(jiān)聽 Activity 的生命周期變化,當(dāng)收到 Event = ON_DESTROY && 未發(fā)生配置更新時,此時為真正銷毀,清理所有數(shù)據(jù)。
        getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source,
                    @NonNull Lifecycle.Event event)
 
{
                if (event == Lifecycle.Event.ON_DESTROY) {
                    if (!isChangingConfigurations()) {
                        getViewModelStore().clear();
                    }
                }
            }
        });

        // ... 省略 ...
    }

    // ... 省略 ...
}

通過上面代碼可以發(fā)現(xiàn),依賴于 Lifecycle 提供的生命周期事件,通過 addObserver(),監(jiān)聽 Activity 的生命周期,當(dāng)接收到 ON_DESTROY 事件并且不是因為配置更新(屏幕旋轉(zhuǎn))導(dǎo)致的 destroy 時,調(diào)用 ViewModelStore#clear() 清理所有數(shù)據(jù)。

3. 單Activity多Fragment時,怎么做到Fragment之間共享數(shù)據(jù)的?

通過源碼分析這個問題其實已經(jīng)有結(jié)論了。當(dāng)調(diào)用 ViewModelProvider() 方法傳入的是 getActivity(), ViewModelStore 和 Factory 的創(chuàng)建都是在 Activity 中,所以 ViewModel 的數(shù)據(jù)也是在 Activity 中,所以相當(dāng)于用 Activity 來維護數(shù)據(jù),然后基于此 Activity 的 Fragment 就都可以訪問這些數(shù)據(jù)。

總結(jié)

簡單總結(jié)下 ViewModel 的實現(xiàn)原理:調(diào)用 ViewModelProvider() 方法,該方法內(nèi)部通過接口反向依賴 ViewModelStore 和 Factory 的實現(xiàn)(這里即反向依賴 ComponentActivity 來創(chuàng)建)。然后調(diào)用 ViewModelProvider#get() 方法,該方法內(nèi)部先從 ViewModelStore 中獲取緩存,如果沒有則調(diào)用 Factory#create() 進行創(chuàng)建,經(jīng)過各種條件校驗,最終調(diào)用 ViewModelProvider.NewInstanceFactory#create() 方法,通過 Class.newInstance() 創(chuàng)建出來,最后將新創(chuàng)建的 ViewModel 存入 ViewModelStore 中。下面為調(diào)用時序圖,可參照自行走一遍源碼。


瀏覽 46
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 成人亚洲综合| 免费二区| 国产免费高清视频| 99er视频| 国产日本欧美韩国久久久久 | 久久久国产精品黄毛片| 波多野结衣无码流出| 中文字幕国产综合| 成年人免费视频在线观看| 黄片免费视频观看| 无码插逼| 男女日逼视频| 色99网站| 久久永久免费视频| 人人色人人干| 一级AV| 国产欧美综合一区| 午夜免费无码| 无码AV大香线蕉伊人| 色男人天堂| 三级日韩视频| 欧美aaa视频| 国产丨熟女丨国产熟女视频| 人妻无码A| 日本一区二区在线视频| 日韩一级无码特黄AAA片| 二区在线观看| 欲色av| 黄色成年人视频在线观看| 免费无码网站| 人妻体内射精一区二区| 夜夜骚| 欧美老女人性| 中文字幕亚洲区| 激情性爱婷婷色五月| 天天舔天天射| 国产福利在线观看| 国产主播精品| 777三级| 一区二区三区四区久久| 99热精品久久| 亚洲男人av| 蜜桃av无码一区二区三区| 高清无码黄片| 成人H动漫精品一区二区无码| 久久久久久久久国产精品| 99热国产在线| 精品久久免费一区二区三区| 欧美一区二区三区成人片下载| 色五月激情| 国产亚洲精品久久久波多野结衣| 无码视频一区二区三区| 久久久久久久香蕉视频| 亚洲欧美日韩另类| 中文字幕日本| 免费无码国产在线| 综合色区| 日韩精品一区二区三区四区蜜桃视频| 黄色大片在线| 山东wBBBB搡wBBBB| Www.黄色| 搡bbb| 肥臀AV在线| 亚洲AV成人无码精品区| 伊人导航| 超碰在线观看免费版| 99精品丰满人妻无码| 亚洲国产黄片| 欧美AA视频| 中文午夜福利| 亚洲色欲av| 亚洲欧美成人在线| 国产高清a| 黄色在线免费| 91大吊| 俄女兵一级婬片A片| 婷婷五月天免费视频| 日韩在线中文字幕视频| 免费看a的网站| 亚洲在线高清| 亚洲欧美在线综合| 亚洲www在线| 褒姒AV无玛| 国产高清AV在线| 欧美午夜网站| 久热网站| www.黄色在线观看| 午夜视频成人| 首页-91n| 最新毛片网站| 欧美狠狠干| 91香蕉网| 日韩情色片| 在线观看黄色网| 亚州精品国产精品乱码不99勇敢| 欧美日韩一级A片| 夜夜嗨av无码一区二区三区| 国产AV无码成人精品区| 日韩精品一区二区三免费视频| 蜜桃传媒av| 五月天久久| 中文字幕乱码免费综合久久| 成人综合网站| 午夜成人大片| 国产精品久久毛片A片| 亚洲视频1区| 人人草在线视频| 人妻中文字幕久久| 91视频一区二区| 精品无码蜜桃| 日本一级按摩片免费观看| 久久久久无码国产精品不卡 | 五月激情久久| 少妇搡BBBB搡BBBB毛多多| 影音先锋男人| 日逼图| 久久看片| 午夜做爱福利视频| 东京热在线视频观看| 91在线成人视频| 狼友视频在线播放| 伊人青青操| 亚洲中字幕新| 日韩AV中文字幕在线| 91大神精品| 北条麻妃无码在线播放| 国产操逼图| 中国A级片| 中文字幕久久人妻无码精品蜜桃| 99re在线精品| 91白浆| 欧美性性生交XXXXX无码| 99国产精品久久久久久久| 国产A片视频| 新中文字幕| 波多野结衣无码流出| 久操操| 伊人久久五月| 在线观看免费完整版中文字幕视频| 亚洲小说欧美激情另类A片小说| 无码人妻一区二区三区三| 国产一级AAAAA片免费| 日韩黄色在线视频| 欧美精品欧美精品系列| 无码免费观看视频| 日韩中文在线播放| 亚洲乱码在线| 欧美高清无码| 人人操人人干人人爽| 五月天婷婷网址| 肉片无遮挡一区二区三区免费观看视频| 欧美a级视频| 久久精品视频国产| 日韩无码人妻一区二区三区| 在线观看黄片视频| 国产无码小视频| 免费观看成人片| 欧美肏逼视频| 一级国产欧美成人A片| 国产成人69| 亚洲视频中文字母| 91蝌蚪| 久久久久无码国产精品不卡| 婷婷五月综合激情| 瘦精品无码一区二区三区四区五区六区七区八区 | 69视频在线免费观看| 精品国产无码怀孕| 亚洲黄色视频免费看| 草草影院CCYYCOM屁屁影院合集限制影院 | 日日躁夜夜躁| 日韩一级在线视频| 日韩极品视频| 精品人妻二区三区蜜桃| 国内自拍欧美| 日韩插插| 亚洲精品区| 91亚洲精品久久久久久久久久久久 | 裸体黄色一极大片| 97人人干| 激情开心五月天| 久久熟女嫩草成人片免费| 无码四区| 中文字幕VA| 欧美一级日韩三级| 大鸡巴午夜爽视频电影| 一区二区三区日本| 国产色哟哟| 日本一本在线| 香蕉视频成人在线观看| 先锋影音一区二区三区| 妻子互换被高潮了三次| 日韩欧美中文字幕在线视频| 天天日天天草天天干| 佐山爱人妻无码蜜桃| 四虎av| 久久精品大香蕉| 在线观看视频免费无码免费视频| 成人水蜜桃| 黄色电影免费看| 婷婷精品国产a久久综合| 日韩无码人妻一区| 日本精品在线播放| 69AV免费视频| 欧美A级黄片| 老司机狠狠干| 欧美成人黄色电影| 成人H动漫精品一区二区三区蘑菇 高清无码视频在线免费观看 | 国产精品婷婷午夜在线观看| 欧美一级A片在线观看| 久久亚洲一区| 日韩成人无| 蜜桃一区二区中午字幕| 亚洲中文视频| 亚洲无码成人网站| 免费A片国产毛无码A片| 国产日皮视频| 国精品91无码一区二区三区在线 | 天天干天天撸影视| 久久久网站| 欧美人人操| 香蕉伊人网| 无码av在线观看| 水蜜桃视频网| 大香蕉操逼| 日韩在线免费| 69精品| 日韩成人无码毛片| 精品一区二区三区四区| 乱伦无码高清麻豆视频一区二区| 国产在线欧美在线白浆| 懂色一区二区三区免费| 一级做a视频| 亚洲无码免费视频在线观看| 大香蕉亚洲网| 黄色片网站视频| 中文人妻无码| 丰满熟妇人妻无码视频| 又黄又湿的视频| 中文字幕区| 日日干日日干| 亚洲av| 最新中文字幕在线视频| 亚洲一二三四| 爱搞搞就要搞| 久久视频理论| 欧美成人性色欲影院| 91精品国产乱码| 国产内射久久| 亚洲www视频| A片网站在线观看| 色老板视频在线观看| 色香蕉在线| 97国产超碰| 久久艹骚逼| 国产在线色视频| 天天看高清无码| 91无码一区二区三区| 无码人妻少妇| 青娱乐亚洲精品| 操操网| 九九热精品视频在线观看| 中文字字幕在线中文乱码| 日韩小视频| 欧美A视频在线观看| 欧美日韩亚洲一区二区三区| 无码AV电影在线观看| 97精品人妻一区二区三区香蕉农| 国产精品v欧美精品v日韩| 国产l精品久久久久久久久久| 亚洲第一黄片| 日本少妇高潮| 国产免费一区二区三区| 成人h网站在线观看| 亚洲无码免费在线视频| 337P粉嫩大胆噜噜噜55569| 性无码一区二区三区在线观看| 亚洲高清无码在线视频| 日韩成人无码一区二区| 淫荡少妇美红久久久久久久久久| 日韩高清无码成人| 老妇槡BBBB| 在线视频一区二区三区四区| 欧美三级欧美成人高清| 日韩黄色大片| 444444免费高清在线观看电视剧的注意 | 久久久精品人妻| 女人自慰在线观看| 黄色av网站免费| 狼人一区二区| 西西444WWW无码大胆| 国产黄色视频在线| 免费无码成人| 亚洲污污| 欧美一级大香蕉| 久草福利在线| 伊人性视频| 亚洲国产成人无码a在线播放| 日韩免费视频观看| 亲子乱AⅤ一区二区三区| 中文字幕免费在线观看| 特一级黄A片| 草在线| 免费黄片网站在线观看| 三级A片| 人妻丰满熟妇| 成人爽爽视频| 安徽妇搡BBB搡BBBB户外老太太 | 色久综合| 婷婷丁香五月花| 蝌蚪窝免费视频| 国产成人av在线| 怡春院中文字幕| 精品国产一| 狠狠色婷婷777| 97干干| 日韩一区二区免费看| 日韩免费不卡| 国产2区| 久久成人综合网| 日本精品视频一区二区| 国产成人高清无码| 成人自拍视频| 91无码人妻精品一区二区三区四| 免费在线观看黄视频| 无码免费看| 99久久久久久久久久| 日韩欧美成人网站| 亚洲黄色影院| 五月天福利网| 免费观看一区二区三区| 午夜免费视频| AV高清无码在线观看| 久久在线免费视频| 韩国AV在线| 伊人热久久| 午夜精东影业传媒在线观看| 大香蕉国产视频| 成人A片免费在线观看| 国产—a毛—a毛A免费看图| 欧美操逼网| 国产在线观看你懂的| 少妇视频一区| 国产免费一区二区三区免费视频 | 国产成人91| 可以免费观看的AV| 欧美99视频| 亚洲最大无码| 18成人毛片| 国产精品V亚洲精品V日韩精品| 黄色片一区二区| 超碰人人干人人操| 亚洲在线视频播放| 婷婷中文| 2025av天堂| 欧美aaaaaa| 五月婷婷六月香| 午夜大黄片| 麻豆91麻豆国产传媒| 九九热日本| 中文字幕第69页| 日韩人妻无码一区二区三区中文| 91夫妻交友视频| 中文字幕少妇| 大肉大捧一进一出两腿| 成人AV一AV二| 日韩欧美高清第一期| 婷婷视频网站| 欧美激情另类| 精品一区二区三区蜜桃臀www | 精品国产AV色一区二区深夜久久| 国产91在线观看| 日韩人妻午夜| 国产亚洲久一区二区三区| A片在线免费观看| 五月天婷婷成人| 51成人网站免费| 国产系列精品AV| 天天操综合| 在线观看AV91| 欧美性高潮| 亚洲精品乱码久久久久久按摩观 | 黄色视频网站免费在线观看| 日韩乱伦网站| www超碰| 亚洲成人高清在线| 日韩免费A片| 青娱乐在线精品| 国产jk在线观看| 蜜桃精品一区二区| 色诱av| 久久五月亭亭| 日韩精品区| 草逼视频网站| 一级免费毛片| 麻豆成人网| 久久嫩草精品久久久久精| 成人黄色AV| 国产精品久久久久久久久久二区三区 | 动漫人物插画动漫人物的视频软件| 一本一道久久| 91在线无码精品秘入口电车| 免费在线黄色电影| 日韩中文字幕视频在线观看| 欧美日韩一区二区三区| 俄罗斯白嫩BBwBBwBBw91| 中文字幕福利电影| 亚洲自拍网站| 成人黄色导航| 亚洲中文字幕码mv| 色中色AV| 丁香五月天激情| 国产18毛片18水多精品| 天天谢天天干| 免费在线观看a| 国产精品一区二区三区不卡| 殴美老妇BBBBBBBBB| 中文字幕精品视频在线观看| 丰满人妻一区二区三区视频在线不卡| 黄色电影网站在线观看| 亚洲无码在线高清| 在线免费看毛片| 99免费热视频在线| 操逼视频免费观看| 男人日女人视频| 久了中文字幕| 国产有码视频| 亚洲AV无码专区在线播放中文| 亚洲综合一二三区| 黑人人妻黑人ThePorn| 成人免费啪啪视频| 麻豆一区二区| 丁香色五月婷婷| 一级片操逼| 探花av| 一级性爽AV毛片| 成人黄色毛片视频| 色天堂视频| 中文字幕在线一区二区a| 日韩黄色免费视频| 大香蕉伊人影院| A片在线观看网站| 秋霞精品一区二区三区| 9i看片成人免费视频| 黄色一级片免费| 人妻japanesewoman| 国产一级a毛一级a做免费高清视频 | 四川少妇BBBB槡BBBB槡| 在线视频一区二区三区四区| 成人免费视频网站| 欧美A一| 久久久精品| AV在线无码| 亚洲美女一区| 免费黄色视频网站大全| 高清无码内射视频| 操人| 亚洲秘无码一区二区三区欧美| 成人做爰黄A片免费看直播室动漫 中文字幕一区二区三区四虎在线 欧美熟妇精品一级A片视色 | www.无码视频| 国产黄片自拍| 免费黄网站| 国产又粗又长的视频| 久草视频首页| 五月婷婷色播| 婷婷五月天丁香成人社区| 亚洲秘无码一区二区三区胖子| 中日韩一级片| 精品国产一区二区三区久久久蜜月| 麻豆黄色| 亚洲精品久久久久毛片A级绿茶| 亚洲综合99| 伊人婷婷久久| 操久久久久久| 人人操超碰| 成人黄片网站| 另类罕见稀奇videos| 再深点灬好爽灬轻点久久国产| 夜夜操夜夜骑| 国产美女福利| 先锋影音亚洲AV每日资源网站| 视频一视频二在线视频| 亚洲一级黄片| 亚洲AV免费在线观看| 亚洲免费高清视频| 正在播放JUQ-878木下凛凛子 | 中国无码视频| 中文字幕成人A片| 操逼逼网站| 日韩AV无码成人精品| 日韩日批| 91亚洲国产成人精品一区二区三| 看免费黄色录像| 亚洲国产av一区| 偷拍九九热| 久久亚洲日韩天天做日日做综合亚洲 | 小黄片网站| 日韩午夜剧场| 草莓视频在线播放| 性亚洲| 丰满人妻精品一区二区在线| 俺去俺来也WWW色老板| 人人妻人人要| 人人干天天干| 成人aV无码精品国产一区二区| 亚洲尤物| 欧美久久久久久久| 蜜臀av一区| 伊人av网| 夜夜天天人人| 午夜无码福利视频| 安微妇搡BBBB搡BBBB日| 色五月天导航| 国产免费性爱视频| 国产精品久久77777| 911国产在线| 无码在线播放观看| 无码人妻丰满熟妇区17水蜜桃| 国产SUV精品一区二区| 在线成年人视频| 无码一区二区三区免费看| 亚洲乱乱| 简单AV网| 精品欧美成人片在线| 成人毛片av| 五月丁香视频在线观看| 69av在线观看视频| 蜜臀AV在线播放| 色色网五月天| 日韩性做爰免费A片AA片| 高潮国产视频| 久久久久99精品成人网站| 色五月网| 日韩无码一级片| 亚洲国产一区二区三区| 国产成人久久777777黄蓉| 无码视频免费观看| 波多野结衣无码流出| 搞搞电影91| www.777熟女人妻| 欧美熟妇擦BBBB擦BBBB| 亚洲熟妇在线观看一区二区| 成人黄色录像| 欧美日韩在线看| 国产精品午夜福利视频| A在线免费观看| 久操欧美| AV免费在线播放| 在线操逼| 黄片网站免费| 韩国中文字幕HD久久| 自拍毛片| 高清无码视频直接看| 国语操逼| 久久精品苍井空免费一区二| A在线免费观看| 三级AV在线| 97在线观看视频| 超碰超爽| 欧洲在线观看| 免费在线观看无码| 丰满人妻一区二区三区免费| 日韩AV在线免费| 97碰碰碰| 欧美日韩在线免费观看| 国产免费观看av| 久久国产一区二区| 亚洲欧美久久久| 人人操综合| 精品九九九九| 欧美无人区码suv| 久久婷婷五月综合| 中文字幕无码一区二区| 亚洲无码中文字幕视频| 免费看操逼逼| 国产精品无码av| www.偷拍| 中文字幕精品在线免费视频观看视频| 国产三级成人| 加勒比无码视频| 中文字幕一区二区二三区四区| 伊人久久艹| 青青草原av| 96精品久久久久久久久久| 日韩AV无码一区二区| 国产人妻一区二区精选| 精品无码人妻一区二区| 免费一级无码婬片A片APP直播| 九七影院第二页| 伊人色色| 大炕上公让我高潮了六次| 亚洲无码AV在线播放| 天堂中文字幕在线观看| 西西4444WWW无视频| 免费黄视频在线观看| 欧美中文字幕在线播放| a视频在线免费观看| 搡BBBB搡BBB搡五十粉嫩| 国产无码自拍偷拍| 午夜无码高清| 91视频一区二区| 亚洲欧美日韩无码| 国产网友自拍| 成人看片黄a免费看视频| 午夜嘿嘿| 国产91嫩草乱婬A片2蜜臀| 无码日韩人妻精品久久蜜桃| 久久国产精品网站| 国产操女人| 99黄色电影| AV片在线免费观看| 日韩无码毛片| 九九九在线观看视频| 深夜福利一区二区| 国产精品18禁| 黄色视频在线免费看| 成人国产无码| 亚洲高清无码视频在线| 久久69| 日逼小视频| 无码颜射| 日日天天| 特黄一级A片| 国产香蕉av| 884aa四虎影成人精品一区| 福利视频中文字幕| 国产成人免费视频在线| 国产av激情| 黄色香蕉网站| 亚洲免费黄片| 久操影视| 日韩精品极品视频在线观看免费| 欧美成人手机在线| avcom无码| 99久久婷婷国产综合| 免费精品视频| 欧美h| 先锋影音资源AV| 亚洲AV在线免费观看| 欧美乱欲视频| 一级A级毛片| 精品黄片| 婷婷五月天丁香在线| 香蕉久久网| 国产精品欧美综合亚洲| 色噜噜狠狠一区二区三区牛牛影视| 亚洲精品秘一区二区三线观看 | 一级片久久| 中文字幕乱码免费综合久久| av在线一区二区三区| 五月丁香中文字幕| 精品国产一级A片黄毛网站| 欧美成人高清视频| 天天干天天摸| av久操| 特级无码| 婷婷亚洲五月色综合| 免费做爱网站| 日韩成人黄色视频| 中文字幕在线电影| 欧美狠狠干| 青青青亚州视频在线| 国产美女自慰网站| 亚洲无码久久网| 黄片在线免费观看视频| 2019狠狠操| 日本综合视频| 婷婷爱要操| 天天日狠狠操| 高清无码免费| 亚洲黄色毛片| 精品熟女| 亚洲AV一二三区| 亚洲精品午夜福利| 三级毛片视频| 日本亚洲欧美| 亚洲AV无码乱码A片无码沈樵| 亚洲免费观看高清完整版| A级成人网站| 亚洲无码少妇| 亚州成人| 99热99re6国产线播放| 无码精品一区二区| 激情婷婷六月| 日本黄色小视频| 欧美色图视频在线观看| 人人操在线观看| 国产suv精品一区二区6精华液| 哪里可以看毛片| 国产丝袜久久| 性爱视频免费网站| 欧美日韩性色无码免费| 美女一区| 人人夜夜人人| 国产黄网| 北京熟妇搡BBBB搡BBBB| 四川美女网久草| 国产成人无码精品久在线观看| 永久免费看片视频5355| 簧片网站在线观看| 国产理论视频在线观看| 精品久久ai| 人人色人人草| 国产成人免费在线观看| 国产大屌| 性爱免费视频| 小视频你懂的| 4080yy午夜理论片成人| 1024国产| 人妻免费在线视频| 99在线视频免费观看| 91视频第一页| 黄片免费网站| 五月丁香六月婷婷综合| 精品乱子伦一区二区三区毛| 人人操人人干人人爽| 动漫人物插画动漫人物的视频软件 | 成人黄色视频网站在线观看| 午夜精品久久久久久久久无码99热 | 丁香六月婷| 江苏妇搡BBBB搡BBBB小说| 婷婷午夜精品久久久久久性色| 在线不卡免费Av| 性饥渴熟妇乱子伦| 东京热一级片| 天天日天天操天天射| 色色色热| 日韩一区二区三免费高清在线观看| 天堂国产| 日日骚影院| 国产精品乱伦| 亚洲三级黄色| 操B国产| 青青草视频在线观看| 狠狠躁日日躁夜夜躁2022麻豆| 成人黄片在线免费观看| 亲子乱AⅤ一区二区三区| 91丨九色丨熟女泻火| 欧美乱轮| 狠狠操综合| 在线看片av| 精品孕妇一级A片免费看| 国产无套视频| 亚洲国产成人AV| 韩日A片| 亚洲精品三级片| NP玩烂了公用爽灌满视频播放 | 国产主播精品在线| 中文字幕在线观看免费高清电影| 国内自拍视频网| 菊花插综合网| 专区无日本视频高清8| 无码人妻丰满熟妇精品| 怕怕怕视频| 九色在线视频| 手机在线观看av| 成人在线无码视频| 俺去搞| 怡春院成人| 黄色无码av| 理论毛片| 天天爽夜夜爽夜夜爽精品视频| 亚洲电影中文字幕| 色哟哟一中文字慕| 亚洲AV无码一区毛片AV| 一本道高清无码视频| 精品孕妇一区二区三区| 久久久WWW成人免费无遮挡大片| 亚洲133| 在线观看你懂得| 狠狠干婷婷| 人妻丰满熟妇av无码| 国产欧美一区在线看| 中国字幕在线观看韩国电影| 天码人妻一区二区三区在线看| 久久久偷拍视频| 手机在线小视频| 草逼无码| 超碰在线无码| 中文字幕AV在线免费观看| 精品AV无码一区二区三区| 日本黄色免费| 在线中文字幕AV| 乱伦乱码| 国产SUV精品一区二区| 人人摸人人爱| 亚洲色图在线视频| 91在线无码精品秘国产-百度| 国产又爽又黄免费观看| 欧美熟女性爱视频| 日韩av在线免费观看| 成人三级视频在线观看| 国产无遮挡又黄又爽又色| 97色吧| 亚洲A片免费看| 日日夜夜精品| 成人一级电影| 无码av中文字幕| a片免费在线| 二区三区视频| 综合狠狠| 91鸡巴| 欧美三级片在线| 国产精品秘麻豆免费版现看视频| 密臀av在线| 国产亲子乱XXXXimim/| 97播播| 欧美后门菊门交4| 免费无码视频一区二区| 亚洲无码第一页| 在线操逼| 蜜臀久久| 一区二区三区无码高清| 无码人妻在线播放| 黄色视频在线观看地址| 国产欧美综合一区| 夜夜骚| 欧美天堂成人三级| 高潮喷水在线观看| 黄色一级片免费看| 99成人视频| 在线18禁| 国产操逼小视频| 伊人影院99| 麻豆福利在线| 法国《少女日记》电影| 中文字幕一区在线观看| 尻屄视频在线观看| 国产AV不卡| 丰满人妻无码| 七六十路の高齢熟妇无码| 91看片看婬黄大片女跟女| 国产精品久久久久无码AV| 人人操人人上| AV在线大香蕉| 人妖黃色一級A片| 毛片天堂| 天堂91| 欧美黄色激情视频网站| 天天干夜夜操| 这里只有精品视频| 日韩婷婷| 内射学生妹| 久久精品福利视频| 超碰97人人操| 欧美成人无码A片免费| AV三级片在线观看| 日本欧美亚洲| 婷婷久久亚洲| 91精品国产日韩91久久久久久| av网站免费看| 亚洲免费一级| 骚熟妇| 午夜福利影片| 免费播放婬乱男女婬视频国产| 91超碰久久在线| 精品成人视频| 蜜桃视频com.www| 激情丁香五月婷婷| 大香蕉免费| 男女AV网站| 国产三级无码视频| 99爱免费视频| 大炕上公让我高潮了六次| 二区三区免费| 欧美国产一区二区| 91九色网| 国产免费av片| 婷婷性爱五月天| 东北老女人操逼视频| 97久久人人| 国产17c精品视频一二三区| 2025天天干| 国产黄色视频在线免费观看| 91狠狠| 大香蕉伊在线观看| 中文人妻第9页| 黄色毛片网站| 国产欧美一区二区三区视频| 成人国产精品免费观看| 熟妇人妻久久中文字幕| 水蜜桃视频网站在线观看| 黄色片在线视频| 人妻丰满精品一区二区| 好逼天天有| 天堂av在线免费观看| 天天干无码| 熟女嗷嗷叫高潮合集91| 欧美亚洲日本| A级网站| 天天干天天爽| 国产麻豆AⅤMDMD0071| 亚洲无码视频免费看| 亚洲欧洲在线视频| 精品黄片| 亚洲视频456| www.777熟女人妻| 成人天堂一区二区三区| 一本加勒比HEZYO东京热无码| www.97色| www.天天射|