久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Android ViewModel的使用總結

瀏覽:132日期:2022-09-17 18:13:31
目錄基本使用MainRepositoryMainViewModelMainActivity

ViewModel 相關問題是高頻面試題。主要源于它是 MVVM 架構模式的重要組件,并且它可以在因配置更改導致頁面銷毀重建時依然保留 ViewModel 實例。

看看 ViewModel 的生命周期

Android ViewModel的使用總結

ViewModel 只有在正常 Activity finish 時才會被清除。

問題來了:

為什么Activity旋轉屏幕后ViewModel可以恢復數據 ViewModel 的實例緩存到哪兒了 什么時候 ViewModel#onCleared() 會被調用

在解決這三個問題之前,回顧下 ViewModel 的用法特性

基本使用MainRepository

class MainRepository { suspend fun getNameList(): List<String> {return withContext(Dispatchers.IO) { listOf('張三', '李四')} }}MainViewModel

class MainViewModel: ViewModel() { private val nameList = MutableLiveData<List<String>>() val nameListResult: LiveData<List<String>> = nameList private val mainRepository = MainRepository()fun getNames() {viewModelScope.launch { nameList.value = mainRepository.getNameList()} }}MainActivity

class MainActivity : AppCompatActivity() { // 創建 ViewModel 方式 1 // 通過 kotlin 委托特性創建 ViewModel // 需添加依賴 implementation ’androidx.activity:activity-ktx:1.2.3’ // viewModels() 內部也是通過 創建 ViewModel 方式 2 來創建的 ViewModel private val mainViewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) {super.onCreate (savedInstanceState)setContentView(R.layout.activity_main)// 創建 ViewModel 方式 2val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)mainViewModel.nameListResult.observe(this, { Log.i('MainActivity', 'mainViewModel: nameListResult: $it') Log.i('MainActivity', 'MainActivity: ${this@MainActivity} mainViewModel: $mainViewModel mainViewModel.nameListResult: ${mainViewModel.nameListResult}')})mainViewModel.getNames() }}

測試步驟:打開app -> 正常看到日志

18:03:02.575 : mainViewModel: nameListResult: [張三, 李四]18:03:02.575 : com.yqy.myapplication.MainActivity@7ffa77 mainViewModel: com.yqy.myapplication.MainViewModel@29c0057 mainViewModel.nameListResult: androidx.lifecycle.MutableLiveData@ed0d744

接著測試步驟:打開設置更換系統語言 -> 切換到當前app所在的任務 再看日志

18:03:59.622 : mainViewModel: nameListResult: [張三, 李四]18:03:59.622 : com.yqy.myapplication.MainActivity@49a4455 mainViewModel: com.yqy.myapplication.MainViewModel@29c0057 mainViewModel.nameListResult: androidx.lifecycle.MutableLiveData@ed0d744

神奇!MainActivity 被重建了,而 ViewModel 的實例沒有變,并且 ViewModel 對象里的 LiveData 對象實例也沒變。 這就是 ViewModel 的特性。

ViewModel 出現之前,Activity 可以使用 onSaveInstanceState() 方法保存,然后從 onCreate() 中的 Bundle 恢復數據,但此方法僅適合可以序列化再反序列化的少量數據(IPC 對 Bundle 有 1M 的限制),而不適合數量可能較大的數據,如用戶信息列表或位圖。 ViewModel 的出現完美解決這個問題。

我們先看看 ViewModel 怎么創建的: 通過上面的實例代碼,最終 ViewModel 的創建方法是

val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

神奇!MainActivity 被重建了,而 ViewModel 的實例沒有變,并且 ViewModel 對象里的 LiveData 對象實例也沒變。 這就是 ViewModel 的特性。

ViewModel 出現之前,Activity 可以使用 onSaveInstanceState() 方法保存,然后從 onCreate() 中的 Bundle 恢復數據,但此方法僅適合可以序列化再反序列化的少量數據(IPC 對 Bundle 有 1M 的限制),而不適合數量可能較大的數據,如用戶信息列表或位圖。 ViewModel 的出現完美解決這個問題。

我們先看看 ViewModel 怎么創建的: 通過上面的實例代碼,最終 ViewModel 的創建方法是

val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

創建 ViewModelProvider 對象并傳入了 this 參數,然后通過 ViewModelProvider#get 方法,傳入 MainViewModel 的 class 類型,然后拿到了 mainViewModel 實例。

ViewModelProvider 的構造方法

public ViewModelProvider(@NonNull ViewModelStoreOwner owner) { // 獲取 owner 對象的 ViewModelStore 對象this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory(): NewInstanceFactory.getInstance()); }

ViewModelProvider 構造方法的參數類型是 ViewModelStoreOwner ?ViewModelStoreOwner 是什么?我們明明傳入的 MainActivity 對象呀! 看看 MainActivity 的父類們發現

public class ComponentActivity extends androidx.core.app.ComponentActivity implements...// 實現了 ViewModelStoreOwner 接口ViewModelStoreOwner,...{ private ViewModelStore mViewModelStore;// 重寫了 ViewModelStoreOwner 接口的唯一的方法 getViewModelStore() @NonNull @Override public ViewModelStore getViewModelStore() {if (getApplication() == null) { throw new IllegalStateException('Your activity is not yet attached to the ' + 'Application instance. You can’t request ViewModel before onCreate call.');}ensureViewModelStore();return mViewModelStore; }

ComponentActivity 類實現了 ViewModelStoreOwner 接口。 奧 ~~ 剛剛的問題解決了。

再看看剛剛的 ViewModelProvider 構造方法里調用了 this(ViewModelStore, Factory),將 ComponentActivity#getViewModelStore 返回的 ViewModelStore 實例傳了進去,并緩存到 ViewModelProvider 中

public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {mFactory = factory;// 緩存 ViewModelStore 對象mViewModelStore = store; }

接著看 ViewModelProvider#get 方法做了什么

@MainThread public <T extends ViewModel> T 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); }

獲取 ViewModel 的 CanonicalName , 調用了另一個 get 方法

@MainThread public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) { // 從 mViewModelStore 緩存中嘗試獲取ViewModel viewModel = mViewModelStore.get(key);// 命中緩存if (modelClass.isInstance(viewModel)) { if (mFactory instanceof OnRequeryFactory) {((OnRequeryFactory) mFactory).onRequery(viewModel); } // 返回緩存的 ViewModel 對象 return (T) viewModel;} else { //noinspection StatementWithEmptyBody if (viewModel != null) {// TODO: log a warning. }}// 使用工廠模式創建 ViewModel 實例if (mFactory instanceof KeyedFactory) { viewModel = ((KeyedFactory) mFactory).create(key, modelClass);} else { viewModel = mFactory.create(modelClass);}// 將創建的 ViewModel 實例放進 mViewModelStore 緩存中mViewModelStore.put(key, viewModel);// 返回新創建的 ViewModel 實例return (T) viewModel; }

mViewModelStore 是啥?通過 ViewModelProvider 的構造方法知道 mViewModelStore 其實是我們 Activity 里的 mViewModelStore 對象,它在 ComponentActivity 中被聲明。 看到了 put 方法,不難猜它內部用了 Map 結構。

public class ViewModelStore {// 果不其然,內部有一個 HashMap private final HashMap<String, ViewModel> mMap = new HashMap<>(); final void put(String key, ViewModel viewModel) {ViewModel oldViewModel = mMap.put(key, viewModel);if (oldViewModel != null) { oldViewModel.onCleared();} }// 通過 key 獲取 ViewModel 對象 final ViewModel get(String key) {return mMap.get(key); } Set<String> keys() {return new HashSet<>(mMap.keySet()); } /** * Clears internal storage and notifies ViewModels that they are no longer used. */ public final void clear() {for (ViewModel vm : mMap.values()) { vm.clear();}mMap.clear(); }}

到這兒正常情況下 ViewModel 的創建流程看完了,似乎沒有解決任何問題~ 簡單總結:ViewModel 對象存在了 ComponentActivity 的 mViewModelStore 對象中。 第二個問題解決了:ViewModel 的實例緩存到哪兒了

轉換思路 mViewModelStore 出現頻率這么高,何不看看它是什么時候被創建的呢?

記不記得剛才看 ViewModelProvider 的構造方法時 ,獲取 ViewModelStore 對象時,實際調用了 MainActivity#getViewModelStore() ,而 getViewModelStore() 實現在 MainActivity 的父類 ComponentActivity 中。

// ComponentActivity#getViewModelStore() @Override public ViewModelStore getViewModelStore() {if (getApplication() == null) { throw new IllegalStateException('Your activity is not yet attached to the ' + 'Application instance. You can’t request ViewModel before onCreate call.');}ensureViewModelStore();return mViewModelStore; }

在返回 mViewModelStore 對象之前調用了 ensureViewModelStore()

void ensureViewModelStore() {if (mViewModelStore == null) { NonConfigurationInstances nc = (NonConfigurationInstances) getLastNonConfigurationInstance(); if (nc != null) {// Restore the ViewModelStore from NonConfigurationInstancesmViewModelStore = nc.viewModelStore; } if (mViewModelStore == null) {mViewModelStore = new ViewModelStore(); }} }

當 mViewModelStore == null 調用了 getLastNonConfigurationInstance() 獲取 NonConfigurationInstances 對象 nc,當 nc != null 時將 mViewModelStore 賦值為 nc.viewModelStore,最終 viewModelStore == null 時,才會創建 ViewModelStore 實例。

不難發現,之前創建的 viewModelStore 對象被緩存在 NonConfigurationInstances 中

// 它是 ComponentActivity 的靜態內部類 static final class NonConfigurationInstances {Object custom;// 果然在這兒ViewModelStore viewModelStore; }

當 mViewModelStore == null 調用了 getLastNonConfigurationInstance() 獲取 NonConfigurationInstances 對象 nc,當 nc != null 時將 mViewModelStore 賦值為 nc.viewModelStore,最終 viewModelStore == null 時,才會創建 ViewModelStore 實例。

不難發現,之前創建的 viewModelStore 對象被緩存在 NonConfigurationInstances 中

// 它是 ComponentActivity 的靜態內部類 static final class NonConfigurationInstances {Object custom;// 果然在這兒ViewModelStore viewModelStore; }

NonConfigurationInstances 對象通過 getLastNonConfigurationInstance() 來獲取的

// Activity#getLastNonConfigurationInstance /** * Retrieve the non-configuration instance data that was previously * returned by {@link #onRetainNonConfigurationInstance()}. This will * be available from the initial {@link #onCreate} and * {@link #onStart} calls to the new instance, allowing you to extract * any useful dynamic state from the previous instance. * * <p>Note that the data you retrieve here should <em>only</em> be used * as an optimization for handling configuration changes. You should always * be able to handle getting a null pointer back, and an activity must * still be able to restore itself to its previous state (through the * normal {@link #onSaveInstanceState(Bundle)} mechanism) even if this * function returns null. * * <p><strong>Note:</strong> For most cases you should use the {@link Fragment} API * {@link Fragment#setRetainInstance(boolean)} instead; this is also * available on older platforms through the Android support libraries. * * @return the object previously returned by {@link #onRetainNonConfigurationInstance()} */ @Nullable public Object getLastNonConfigurationInstance() {return mLastNonConfigurationInstances != null? mLastNonConfigurationInstances.activity : null; }

好長一段注釋,大概意思有幾點:

onRetainNonConfigurationInstance 方法和 getLastNonConfigurationInstance 是成對出現的,跟 onSaveInstanceState 機制類似,只不過它是僅用作處理配置更改的優化。 返回的是 onRetainNonConfigurationInstance 返回的對象

onRetainNonConfigurationInstance 和 getLastNonConfigurationInstance 的調用時機在本篇文章不做贅述,后續文章會進行解釋。

看看 onRetainNonConfigurationInstance 方法

/*** 保留所有適當的非配置狀態*/ @Override @Nullable @SuppressWarnings('deprecation') public final Object onRetainNonConfigurationInstance() {// Maintain backward compatibility.Object custom = onRetainCustomNonConfigurationInstance();ViewModelStore viewModelStore = mViewModelStore;// 若 viewModelStore 為空,則嘗試從 getLastNonConfigurationInstance() 中獲取if (viewModelStore == null) { // No one called getViewModelStore(), so see if there was an existing // ViewModelStore from our last NonConfigurationInstance NonConfigurationInstances nc = (NonConfigurationInstances) getLastNonConfigurationInstance(); if (nc != null) {viewModelStore = nc.viewModelStore; }}// 依然為空,說明沒有需要緩存的,則返回 nullif (viewModelStore == null && custom == null) { return null;}// 創建 NonConfigurationInstances 對象,并賦值 viewModelStoreNonConfigurationInstances nci = new NonConfigurationInstances();nci.custom = custom;nci.viewModelStore = viewModelStore;return nci; }

到這兒我們大概明白了,Activity 在因配置更改而銷毀重建過程中會先調用 onRetainNonConfigurationInstance 保存 viewModelStore 實例。 在重建后可以通過 getLastNonConfigurationInstance 方法獲取之前的 viewModelStore 實例。

現在解決了第一個問題:為什么Activity旋轉屏幕后ViewModel可以恢復數據

再看第三個問題:什么時候 ViewModel#onCleared() 會被調用

public abstract class ViewModel { protected void onCleared() { } @MainThread final void clear() {mCleared = true;// Since clear() is final, this method is still called on mock objects// and in those cases, mBagOfTags is null. It’ll always be empty though// because setTagIfAbsent and getTag are not final so we can skip// clearing itif (mBagOfTags != null) { synchronized (mBagOfTags) {for (Object value : mBagOfTags.values()) { // see comment for the similar call in setTagIfAbsent closeWithRuntimeException(value);} }}onCleared(); }}

onCleared() 方法被 clear() 調用了。 剛才看 ViewModelStore 源碼時好像是調用了 clear() ,回顧一下:

public class ViewModelStore { private final HashMap<String, ViewModel> mMap = new HashMap<>(); final void put(String key, ViewModel viewModel) {ViewModel oldViewModel = mMap.put(key, viewModel);if (oldViewModel != null) { oldViewModel.onCleared();} } final ViewModel get(String key) {return mMap.get(key); } Set<String> keys() {return new HashSet<>(mMap.keySet()); } /** * Clears internal storage and notifies ViewModels that they are no longer used. */ public final void clear() {for (ViewModel vm : mMap.values()) { vm.clear();}mMap.clear(); }}

onCleared() 方法被 clear() 調用了。 剛才看 ViewModelStore 源碼時好像是調用了 clear() ,回顧一下:

public class ViewModelStore { private final HashMap<String, ViewModel> mMap = new HashMap<>(); final void put(String key, ViewModel viewModel) {ViewModel oldViewModel = mMap.put(key, viewModel);if (oldViewModel != null) { oldViewModel.onCleared();} } final ViewModel get(String key) {return mMap.get(key); } Set<String> keys() {return new HashSet<>(mMap.keySet()); } /** * Clears internal storage and notifies ViewModels that they are no longer used. */ public final void clear() {for (ViewModel vm : mMap.values()) { vm.clear();}mMap.clear(); }}

在 ViewModelStore 的 clear() 中,遍歷 mMap 并調用 ViewModel 對象的 clear() , 再看 ViewModelStore 的 clear() 什么時候被調用的:

// ComponentActivity 的構造方法 public ComponentActivity() {... getLifecycle().addObserver(new LifecycleEventObserver() { @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {if (event == Lifecycle.Event.ON_DESTROY) { // Clear out the available context mContextAwareHelper.clearAvailableContext(); // And clear the ViewModelStore if (!isChangingConfigurations()) {getViewModelStore().clear(); }} }});... }

觀察當前 activity 生命周期,當 Lifecycle.Event == Lifecycle.Event.ON_DESTROY,并且 isChangingConfigurations() 返回 false 時才會調用 ViewModelStore#clear 。

// Activity#isChangingConfigurations() /** * Check to see whether this activity is in the process of being destroyed in order to be * recreated with a new configuration. This is often used in * {@link #onStop} to determine whether the state needs to be cleaned up or will be passed * on to the next instance of the activity via {@link #onRetainNonConfigurationInstance()}. * * @return If the activity is being torn down in order to be recreated with a new configuration, * returns true; else returns false. */ public boolean isChangingConfigurations() {return mChangingConfigurations; }

isChangingConfigurations 用來檢測當前的 Activity 是否因為 Configuration 的改變被銷毀了, 配置改變返回 true,非配置改變返回 false。

總結,在 activity 銷毀時,判斷如果是非配置改變導致的銷毀, getViewModelStore().clear() 才會被調用。

第三個問題:什么時候 ViewModel#onCleared() 會被調用 解決!

以上就是Android ViewModel的使用總結的詳細內容,更多關于Android ViewModel的使用的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 欧美精品区 | 久久久久亚洲一区二区三区 | 欧美日韩国产高清视频 | av免费网站在线观看 | 久草.com | 91亚洲精品久久久 | 精品国产一区二区三区久久久久久 | 中文字幕国产一区 | 三区在线观看 | 久久久久久免费 | 欧美色综合 | 精品久久久久久国产 | 日韩在线观看视频一区二区 | 日韩另类 | 中文字幕av一区 | 日韩在线观看 | 午夜国产精品视频 | 五月婷婷导航 | 亚洲黄色免费观看 | 色综合免费视频 | www在线看片 | 国产精品成人国产乱一区 | 欧美一区二区三区 | 男人的天堂中文字幕 | 日本一区二区三区免费观看 | 国产高清视频一区 | 97视频在线免费观看 | 超碰97免费在线 | 国产精品毛片一区二区三区 | 亚洲一级视频在线 | 日韩中文视频 | 国产99久久精品 | 韩日精品一区 | 国产精品日产欧美久久久久 | 日韩激情欧美 | 无码日韩精品一区二区免费 | 午夜精| 欧美激情国产日韩精品一区18 | 亚洲免费资源 | 国产精品2区 | 91在线视频免费观看 | 日本视频一区二区三区 | 成人免费xxx在线观看 | 欧美精产国品一二三区 | 国产精品久久久一区 | 成人在线 | 日韩国产欧美在线观看 | 国产高清一区二区三区 | 亚洲精品乱码久久久久久不卡 | 久久伊 | 天天干天天操 | 欧美成人免费在线观看 | 国产激情网站 | 亚洲欧洲精品一区二区 | 欧美一级在线 | 激情六月综合 | 欧美在线综合 | 国内在线精品 | 欧美成人在线免费观看 | 日韩素人一区二区三区 | 91麻豆精品国产91久久久久久久久 | 中文字幕在线观看www | 国产精品久久久久久久久岛 | 视频精品一区二区三区 | www.亚洲区 | 不卡一区二区三区四区 | www.亚洲一区二区 | 激情综合色综合久久综合 | 国产成人亚洲综合 | www.99精品 | 欧美日韩视频 | 亚洲国产一区二区在线观看 | 成人看片免费网站 | 国产成人视屏 | 天堂一区二区三区四区 | 久久国产精品视频 | 天天操夜夜拍 | 色一情一乱一伦一区二区三区 | 在线精品亚洲欧美日韩国产 | 国产精品爱久久久久久久 | 日韩在线视频观看 | 性瘾调教校园h | 91精品久久久久久久久久 | 欧美中文一区 | 成人看片在线观看 | 天天操综合网 | 国产一区不卡 | 国产精品久久久久久吹潮 | 日韩城人网站 | 欧美二区三区视频 | 中文在线一区 | 日韩精品三区 | 欧美一区二区在线播放 | 成人1区2区 | 不卡一区 | 久久久久网站 | 久久99精品久久久久久园产越南 | 婷婷91 | 亚洲精品一区二三区 | 91精品一区二区三区久久久久久 | 北条麻妃一区二区三区在线 | 日韩一区二区在线观看视频 | 欧美一区二区另类 | 91视频一88av | 日韩国产在线观看 | 美女黄网 | 久久精品中文 | 欧美精品第一页 | 狠狠操狠狠摸 | 99re国产| 日韩中文字幕电影 | 最近免费中文字幕大全免费版视频 | 丁香久久 | 中文字幕久久精品 | 成人欧美一区二区三区白人 | 亚洲最新中文字幕 | 亚洲伦理一区 | 日韩精品一区二区三区中文在线 | 午夜视频在线观看网站 | 成年人黄色一级片 | 国产视频久久久久久 | 国产精品成人一区二区三区夜夜夜 | 欧美a区 | 成人免费一区二区三区视频网站 | 婷婷色在线 | 日韩一二三四 | 狠狠综合久久av一区二区老牛 | 亚洲国产综合在线 | 欧美日韩精品免费观看视频 | 国产精品亚洲综合 | 黄色在线免费看 | 久久99国产精一区二区三区 | 最新日韩免费 | 国产在线a| 私人毛片免费高清视频 | 天堂一区 | 久久精品中文字幕 | 91免费国产| 国产一区 日韩 | 婷婷综合五月 | 免费久久99精品国产婷婷六月 | 成人欧美一区二区三区在线观看 | 成人免费一区二区三区 | 欧美一级做性受免费大片免费 | 精品超碰 | 黄色毛片在线观看 | 99国产精品视频免费观看一公开 | 国产精品中文字幕在线观看 | 国产成人久久 | 欧洲成人午夜免费大片 | 亚洲区在线 | 欧美中文日韩 | 久久久国产一区二区三区 | 黄网免费看| 99久久精品免费看国产免费粉嫩 | 日韩区| 久久久久久国产免费视网址 | 久久亚洲二区 | 欧美麻豆| 91在线精品一区二区 | 亚洲成人免费网站 | 欧美九九九| 国产午夜精品一区二区三区 | 欧美亚洲一区 | 国产精品揄拍一区二区久久国内亚洲精 | 国产成人精品久久 | 日日夜夜天天干干 | 国产真实精品久久二三区 | 成人小视频在线观看 | 日韩中文字幕一区二区 | 欧美激情视频一区二区三区 | 精品无人乱码一区二区三区 | 亚洲国产精品久久人人爱 | 99精品不卡 | 久久99视频这里只有精品 | 国产精品一区二区av | 欧美99| 日韩成人视屏 | 国产欧美精品一区二区三区 | 国产欧美日韩精品一区二区三区 | 青青草99 | 精品中文字幕一区二区 | 国产一区二区视频在线播放 | 亚洲aaaaaa特级 | 久久亚洲精品综合 | 91丨九色丨国产 | 91中文字幕 | 一级黄色片视频 | 免费99视频 | 欧美a在线 | 欧美精品久久久久久久久久丰满 | 国产精品日韩一区二区 | 久久亚洲一区 | 国产精品久久精品 | 亚洲人黄色片 | 91精品久久久久久久久 | 男女视频在线 | 久久久综合网 | 国产福利视频在线观看 | 91社区影院 | 国产成人久久精品一区二区三区 | 91在线看片 | 欧美一二三四成人免费视频 | 91精品国产一区二区三区四区在线 | 黄色大片视频 | 国产高清免费 | 日韩精品一区二区三区四区 | 99国产精品99久久久久久 | 国产精品久久天天躁 | 亚洲国产精品久久久 | 日韩欧美在线观看一区二区三区 | 午夜免费电影 | 一级欧美在线 | 91国内精品久久 | 亚洲精品一区二区网址 | 99久久精品免费看国产一区二区三区 | 在线 亚洲 欧美 | 久久久极品 | 欧美久久久久久久久久伊人 | 最新av在线网址 | 国产精品极品美女在线观看免费 | 欧美一区二区三区在线 | 精品国产成人 | 久久久久久国产 | 日韩91| 国产欧美综合一区二区三区 | 亚洲成人精品在线观看 | 亚洲人在线观看视频 | 国产精品原创巨作av | 成人免费xxxxx在线视频软件 | 国产精品96久久久久久久 | 亚洲三区在线观看 | 天堂一区二区三区四区 | 欧美黑人做爰xxxⅹ 国产精品一区二区视频 | 国产精品久久久久久久竹霞 | 999久久久国产精品 欧美成人h版在线观看 | 国产亚洲网站 | 久久6| 日本久久网 | 欧美日韩亚洲高清 | 亚洲一区二区精品视频 | 青青草在线免费视频 | 国产99久久 | 成人黄色a| 日韩综合视频在线观看 | 操到爽 | 日本久久综合 | 色图综合| 四色成人av永久网址 | 久久久精品久久久久久 | 亚洲欧洲一区二区 | 中文字幕第一页在线 | 日韩性网站 | 久久9精品| 亚洲国产成人av好男人在线观看 | 国产一区二区三区在线免费 | 国产精品不卡视频 | 国产精品久久久久久久午夜 | 亚洲高清在线观看视频 | 一区二区免费看 | 日韩第一区| 98精品国产高清在线xxxx天堂 | 国内久久精品 | 日韩精品一区二区三区第95 | 99亚洲精品 | 中文字幕一区在线观看视频 | 成人免费视频一区二区 | 四虎永久免费在线 | 精品在线一区二区三区 | 91看片网 | 欧美黄色一区二区 | 日本免费在线 | 亚洲精品久久久 | 国产98色在线 | 日韩 | 国产精品99久久久久久久久久久久 | 韩国久久精品 | 久久成人免费视频 | 成人h动漫在线看 | 国产精品久久毛片 | 日韩免费av一区二区 | 成人在线免费视频 | 一二区视频 | 一级毛片,一级毛片 | 欧洲一区二区三区 | 五月天婷婷社区 | 91亚洲狠狠婷婷综合久久久 | 日本三级中文在线电影 | 欧美一级做a爰片免费视频 亚洲精品一区在线观看 | 99re视频在线观看 | 亚洲欧美日韩另类精品一区二区三区 | 亚洲女人天堂av | 久久精品国产91精品亚洲高清 | 黄色大片免费网址 | 中文一区| 亚洲综合二区 | 久草福利 | 99热新| 成人免费视频观看视频 | 成人午夜电影网 | 成人av高清在线观看 | 欧美在线不卡 | 国产精品一区二区无线 | 精品在线播放 | 欧美亚洲国产一区 | 国产v日产∨综合v精品视频 | 免费黄色大片 | 嫩草研究院在线观看入口 | 黄色一级免费观看 | 午夜影院在线观看版 | 欧美一区在线观看视频 | 波多野结衣中文字幕在线视频 | 精品一区视频 | 特级毛片在线大全免费播放 | 久久久成 | 国产精品综合久久 | 黄色影片免费在线观看 | 天天干人人插 | 国产精品久久久久久久久久东京 | 韩国成人精品a∨在线观看 国产伊人av | avmans最新导航地址 | 亚洲成人精品在线观看 | 二区三区 | 国产精品久久久久久亚洲调教 | 蜜桃av一区二区三区 | 亚洲国产精品久久久久久 | 麻豆一区一区三区四区 | 一级一片免费看 | 91久久国产| 国产精品久久片 | 精品中文字幕在线 | 国产精品成人一区二区三区夜夜夜 | 亚洲精品18 | 91一区二区 | 国产精品一区久久久久 | 中文字幕二区 | 国产精品久久久久久吹潮 | 91视视频在线观看入口直接观看 | 中文字幕亚洲一区二区va在线 | 国内精品国产成人国产三级粉色 | 亚洲第一视频网站 | 日本不卡高字幕在线2019 | 亚洲丶国产丶欧美一区二区三区 | 日韩日日夜夜 | 国产成人小视频 | 国产片侵犯亲女视频播放 | 中文字幕第二十六页页 | 久久久精品国产 | 欧美在线视频网站 | 91观看| 91精品视频在线 | 天堂精品| 欧美日韩亚洲三区 | 国产精品久久久久久久久 | www.亚洲一区二区 | 欧美一区二区二区 | 亚洲97| 中文字幕在线视频免费观看 | 国产精品中文字幕在线 | 男女国产视频 | 欧美一区二区三区在线 | 日韩福利在线观看 | 天天操天天摸天天干 | 亚洲欧美日韩精品久久亚洲区 | 大香伊蕉在人线视频777 | 日韩国产在线观看 | 91在线激情| 日韩婷婷 | 亚洲一区中文字幕在线 | 欧美成年人视频 | 国产日韩免费视频 | 99热成人在线 | 中文字幕在线三区 | 色网站视频 | 亚洲综合色网 | 一区二区三区中文字幕 | 欧美成人精品一区二区男人看 | 国产精品福利午夜在线观看 | 久久精品成人一区二区三区蜜臀 | 欧美日韩毛片 | 综合色久| 日韩三级电影免费观看 | 精品国产精品国产偷麻豆 | 欧洲亚洲精品久久久久 | 久久国产亚洲精品 | 国产精品色 | 欧美视频在线观看一区 | 欧美国产精品久久久 | 国产精品视频 | 国产精品久久久久久久久久 | 亚洲免费视频一区 | 欧美日韩在线免费观看 | 成人精品一区二区三区中文字幕 | 91视视频在线观看入口直接观看 | h在线视频 | 9久久精品| 青青草国产在线 | 成人欧美一区二区三区在线观看 | 国产大片在线观看 | 欧美日韩综合视频 | 女人色网| 禁果av一区二区三区 | 欧美成人高清视频 | 国产不卡精品视频 | 国产精品一区二区无线 | 欧美精品一区二区在线观看 | 天堂√在线观看一区二区 | 成人影院www在线观看 | 91视频一88av| 久久亚洲欧美日韩精品专区 | 成人免费视频网站在线观看 | 国模一区二区三区 | 免费一区二区三区 | 日本天堂在线播放 | 亚洲第一国产精品 | 国产高清在线观看 | 国产一级色 | 亚洲成人首页 | 久久久网 | 麻豆网址| 韩国精品视频在线观看 | 久久久久久成人 | 日本福利网站 | 亚洲精品视频免费看 | 在线观看免费毛片视频 | 91亚色 | 亚洲综合二区 | 国产精品久久久久久久午夜片 | 欧美第一区 | 99视频在线 | 黄色国产一级视频 | 成人av教育 | 免费亚洲视频 | 国产一区二区在线视频观看 | 精品一区二区三区在线观看视频 | h片观看| 精品国产成人 | 亚洲激情在线 | 欧美狠狠操 | 久久精品免费视频观看 | 2022天天操| 亚洲欧美另类久久久精品2019 | 久久精品99| 国产美女www爽爽爽免费视频 | 日本免费一区二区三区 | 毛片免费看| 亚洲精品一区二区在线观看 | 欧美一级淫片免费视频黄 | 羞羞视频免费看 | 在线国产视频 | 欧美精品一区二区三区四区 | 91精品国产乱码久久久久久久久 | 中文字幕日韩欧美一区二区三区 | 一级黄视频 | 久久九精品 | 美女超碰在线 | 日韩在线亚洲 | 涩涩视频大全 | 亚欧毛片| 黄色在线免费观看 | 免费观看黄视频 | 一区二区在线看 | 91视频一区二区三区 | 欧美精品亚洲精品日韩精品 | 鲁一鲁综合 | 久久成人一区 | 视频在线一区 | 欧美精品亚洲精品 | 在线中文字幕观看 | 亚洲高清在线观看 | 精品少妇一区二区三区 | 青青久久av北条麻妃海外网 | 骚黄视频 | 爱爱视频网站 | 午夜久久久 | 欧美日韩视频在线 | 欧美在线观看一区二区 | 成人三级在线 | 天天操天天插 | 久久精品免费观看视频 | 91伊人 | 亚洲欧美日韩在线 | 精品国产髙清在线看国产毛片 | 欧美精品网站 | 妞干网福利视频 | 红桃成人少妇网站 | 欧美一区二区三区四区五区 | 日韩激情网 | 国产一级特黄 | 亚洲一区二区三区四区五区午夜 | 国产一区二区三区在线免费 | 久久叉 | 一级黄色毛片免费 | 国产欧美一二三区在线粉嫩 | 日韩一区二区三区在线 | www.国产视频 | 日本久久久久久久久久久久 | 欧美日韩大片在线观看 | 激情小视频在线观看 | 视频一区二区三区中文字幕 | 精品国产黄色片 | 91成人免费在线视频 | 欧美精品二区中文乱码字幕高清 | 99亚洲| 久久久在线 | 黄色一级大片网站 | 久久精品91久久久久久再现 | 九色porny国模私拍av | 亚洲视频在线免费观看 | 亚洲视频在线观看 | 毛片av片| 国产成人无遮挡在线视频 | 精品国产青草久久久久福利 | 日本一区二区三区四区不卡视频 | 日韩免费一区二区 | av免费在线观看网站 | 99热激情| www.com国产精品 | 免费在线观看毛片网站 | 亚洲成人二区 | 欧美黄色大片网站 | 爱爱爱av| 日本精品二区 | 日本少妇bbbb爽爽bbb美 | 精品久久网 | 一区二区日韩视频 | 国产精品久久久久久一区二区三区 | 91精品国产综合久久福利 | 中文字幕不卡 | 亚洲一区亚洲二区 | 精品人人 | 国产精品视频在线观看 | 亚洲精品一区中文字幕乱码 | 一区影院| 久久精品欧美电影 | 一区二区三区在线看 | 亚洲另类小视频 | 日韩资源在线 | 亚洲国产精品一区二区三区 | 日韩精品亚洲专区在线观看 | 欧美电影一区二区三区 | 亚洲高清视频在线观看 | 日本成年人免费网站 | 国产视频一区二区 | 国产97人人超碰caoprom | 男女全黄一级一级高潮免费看 | 91免费观看视频 | 九九热在线视频免费观看 | 久久人人爽人人爽人人片av不 | 综合网av| 欧美日韩精品电影 | 91精品久久久久久久久入口 | 成人在线视频一区二区 | 国产精品视频一区二区三区 | 欧美国产日韩一区 | 国产精品69久久久久水密桃 | 亚洲日韩中文字幕一区 | 久久久精品| 少妇久久久 | 欧美99| 美日一级毛片 | 色综合免费 | 亚洲aⅴ网站 | 国产第99页 | 国产1页| 中文字幕第一页在线视频 | 日韩一区精品视频 | 日韩欧美国产精品 | 精品国产免费久久久久久尖叫 | 国产亚洲精品成人av久久ww | 精品久久久av | 欧美精品一区二区三区四区在线 | 亚洲啪啪网站 | www久久久 | 97免费在线观看视频 | 国产精品久久久久一区二区三区 | 久久久精彩视频 | 亚洲免费精品 | 免费在线日本 | 一本岛在线视频 | 国产成人午夜 | 亚洲欧美一级久久精品 | 成人在线免费观看 | www.久久.com | 日韩欧美一区二区三区视频 | 欧美一区二区在线 | 亚洲国产成人av好男人在线观看 | 国厂毛片| 精品久久中文字幕 | 91在线视频播放 | www.国产精品 | 极品久久 | 国产九九精品 | 成人午夜视频在线 | 国产欧美在线视频 | 真人一级毛片 | 日韩视频在线一区 | 精品一二区 | 久久韩国 | 日本天堂一区二区 | 日韩欧美综合在线 | 国产精品自拍视频 | 九一亚洲精品 | 国产精品中文字幕在线 | 日韩超级毛片 | 99久久视频| 日韩专区中文字幕 | 亚洲国产日韩欧美 | 成人午夜激情 | 91免费视频观看 | 亚洲精品日本 | 亚洲国产婷婷香蕉久久久久久99 | 国产精品久久久久国产a级 99精品欧美一区二区三区综合在线 | 国产精品久久久久久久久 | 欧美日视频| 少妇精品视频在线观看 |