青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

淺析Android線程模型一 --- 轉

摘要:隨著中國移動在8月份相繼發布基于Google AndroidOPhone平臺和手機網上應用商店Mobile Market,以及各大手機生產廠商在2009北京國際通信展?上展出了各自基于Android的 手機,Android技術受到越來越多的關注?;谶@樣的背景 下,本文將通過一個例子來初探Android的線程模型。

關鍵詞:Android;UI thread;線程模型

1引言

Android一詞本義指機器人,Google200711月發布了以Android命名的開源移動設備綜合平臺,包括其基于Linux的操作系統、中間件和關鍵的手機應用。并且組建了開放手機聯盟,其成員囊括了全球著名的各大手機生產 商和移動運營商。20088月,Google又發布了網上應用商店Android Market。任何一個開發者只需要借助Android發 布的SDK開發手機應用,即可把開發的應用在Android Market上銷售。目前Android Market上已經有一萬多的應用程序,大大豐富了Android手機用戶的功能。一個完整的產業鏈已經形成。因此開源Android吸引了原來越多的開發人員加入進來。本文將跟讀者一起學習Android的線程模型。

2 Android進程

在了解Android線程之間得先了解一下Android的進程。當一個程序第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。默認的情況下,所有該程序的組件都將在該進程和線程中運行。同時,Android會為每個應用程序分配一個單獨的LINUX用戶。Android會勁量保留一個正在運行進程,只在內存資源出現不足時,Android會參試停止一些進程從而釋放足夠的資源給其他新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時的響應用戶的事件。Android會 根據進程中運行的組件類別以及組件的狀態來判斷該進程的重要性,Android會 首先停止那些不重要的進程。按照重要性從高到低一共有五個級別:

l  前臺進程

前臺進程是用戶當前正在使用的進程。只有一些前臺進程可以在任何時候都存在。他們是最后一個被結束的,當內存低到根本連他們都不能運行的時候。一般來說, 在這種情況下,設備會進行內存調度,中止一些前臺進程來保持對用戶交互的響應。

l  可見進程

可見進程不包含前臺的組件但是會在屏幕上顯示一個可見的進程是的重要程度很高,除非前臺進程需要獲取它的資源,不然不會被中止。

l  服務進程

運行著一個通過startService() 方法啟動的service,這個service不屬于上面提到的2種更高重要性的。service所在的進程雖然對用戶不是直接可見的,但是他們執行了用戶非常關注的任務(比如播放mp3,從網絡下載數據)。只要前臺進程和可見進程有足夠的內存,系統不會 回收他們。

l  后臺進程

運行著一個對用戶不可見的activity(調用過 onStop() 方法).這些進程對用戶體驗沒有直接的影響,可以在服務進程、可見進程、前臺進 程需要內存的時候回收。通常,系統中會有很多不可見進程在運行,他們被保存在LRU (least recently used) 列表中,以便內存不足的時候被第一時間回收。如果一個activity正 確的執行了它的生命周期,關閉這個進程對于用戶體驗沒有太大的影響。

l  空進程

未運行任何程序組件。運行這些進程的唯一原因是作為一個緩存,縮短下次程序需要重新使用的啟動時間。系統經常中止這些進程,這樣可以調節程序緩存和系統緩 存的平衡。

Android 對進程的重要性評級的時候,選取它最高的級別。另外,當被另外的一個進程依賴的時候,某個進程的級別可能會增高。一個為其他進程服務的進程永遠不會比被服 務的進程重要級低。因為服務進程比后臺activity進程重 要級高,因此一個要進行耗時工作的activity最好啟動一 個service來做這個工作,而不是開啟一個子進程――特別 是這個操作需要的時間比activity存在的時間還要長的時 候。例如,在后臺播放音樂,向網上上傳攝像頭拍到的圖片,使用service可 以使進程最少獲取到“服務進程”級別的重要級,而不用考慮activity目 前是什么狀態。broadcast receivers做費時的工作的時候,也應該啟用一個服務而不是開一個線程。

 2單線程模型

    當一個程序第一次啟動時,Android會同時啟動一個對應的 主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事 件,并把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線 程。在開發Android應用時必須遵守單線程模型的原則: Android UI操作并不是線程安全的并且這些操作必須在UI線程中執行。

2.1 案例演示

如果在沒有理解這樣的單線程模型的情況下,設計的程序可能會使程序性能低下,因為所有的動作都在同一個線 程中觸發。例如當主線程正在做一些比較耗時的操作的時候,如正從網絡上下載一個大圖片,或者訪問數據庫,由于主線程被這些耗時的操作阻塞住,無法及時的響 應用戶的事件,從用戶的角度看會覺得程序已經死掉。如果程序長時間不響應,用戶還可能得重啟系統。為了避免這樣的情況,Android設 置了一個5秒 的超時時間,一旦用戶的事件由于主線程阻塞而超過5秒 鐘沒有響應,Android會 彈出一個應用程序沒有響應的對話框。下面將通過一個案例來演示這種情況:

本程序將設計和實現查看指定城市的當天天氣情況的功能,

1.  首先,需要選擇一個天氣查詢的 服務接口,目前可供選擇的接口很多,諸如YAHOO的 天氣APIGoogle提 供的天氣API。 本文將選擇GOOGLE 的 天氣查詢API。 該接口提供了多種查詢方式,可以通過指定具體城市的經緯度進行查詢,也可以通過城市名稱進行查詢。

2.  用戶在輸入框內輸入需要查詢的 城市名稱,然后點擊查詢按鈕

3.  當用戶點擊查詢按鈕后,使用已 經內置在Android SDK中的HttpClient API來調用GOOGLE 的 天氣查詢API, 然后解析返回的指定城市的天氣信息,并把該天氣信息顯示在Title

主要代碼如下:

public class WeatherReport extends Activity implements OnClickListener {

    private static final String GOOGLE_API_URL = "http://www.google.com/ig/api?weather=";

    private static final String NETWORK_ERROR = "網絡異常";

    private EditText editText;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        editText = (EditText) findViewById(R.id.weather_city_edit);

        Button button = (Button) findViewById(R.id.goQuery);

        button.setOnClickListener(this);

    }

    @Override

    public void onClick(View v) {

        //獲得用戶輸入的城市名稱

        String city = editText.getText().toString();

        //調用Google 天氣API查詢指定城市的當日天氣 情況

        String weather = getWetherByCity(city);

        //把天氣信息顯示在title

        setTitle(weather);

    }

    

    public String getWetherByCity(String city) {

        HttpClient httpClient = new DefaultHttpClient();

        HttpContext localContext = new BasicHttpContext();

        HttpGet httpGet = new HttpGet(GOOGLE_API_URL + city);

        try {

            HttpResponse response = httpClient.execute(httpGet, localContext);

            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

                httpGet.abort();

            else {

                HttpEntity httpEntity = response.getEntity();

                return parseWeather(httpEntity.getContent());

            }

        catch (Exception e) {

            Log.e("WeatherReport""Failed to get weather", e);

        finally {

            httpClient.getConnectionManager().shutdown();

        }

        return NETWORK_ERROR;

    }

}

當用戶輸入城市名稱,然后單擊按鈕進行查詢后,程序會調用Google API的接口獲得指定城市的當日天氣情況。由于需要訪問網絡,所以當網絡出現異?;蛘叻辗泵Φ臅r候都會使訪問網絡的動作很耗時。本文為了 要演示超時的現象,只需要制造一種網絡異常的狀況,最簡單的方式就是斷開網絡連接,然后啟動該程序,同時觸發一個用戶事件,比如按一下MENU鍵, 由于主線程因為網絡異常而被長時間阻塞,所以用戶的按鍵事件在5秒 鐘內得不到響應,Android會 提示一個程序無法響應的異常,如下圖:


淺析Android線程模型(原創)三


 

該對話框會詢問用戶 是繼續等待還是強行退出程序。當你的程序需要去訪問未知的網絡的時候都會可能會發生類似的超時的情況,用戶的響應得不到及時的回應會大大的降低用戶體驗。 所以我們需要參試以別的方式來實現 

2.1 子線程更新UI

    顯然如果你的程序需要執行耗時的操作的話,如果像上例一樣由主線程來負責執行 該操作是錯誤的。所以我們需要在onClick方 法中創建一個新的子線程來負責調用GOOGLE API來獲得天氣數據。剛接觸Android的 開發者最容易想到的方式就是如下:

    public void onClick(View v) {

       //創建一個子線程執行耗時的從網絡上獲取天氣信息的操作

       new Thread() {

           @Override

           public void run() {

              //獲得用戶輸入的城市名稱

              String city = editText.getText().toString();

              //調用Google 天氣API查詢指定城市的當日天氣 情況

              String weather = getWetherByCity(city);

              //把天氣信息顯示在title

              setTitle(weather);

           }

       }.start();

    }

但是很不幸,你會發 現Android會 提示程序由于異常而終止。為什么在其他平臺上看起來很簡單的代碼在Android上運行的時候依然會出錯呢?如果你觀察LogCat中打印的日志信息就會發現這樣的錯誤日志:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

從錯誤信息不難看出Android禁 止其他子線程來更新由UI thread創建的試圖。本例中顯示天氣信息的title實際是就是一個由UI thread所創建的TextView,所以參試在一個子線程中去更改TextView的時候就出錯了。這顯示違背了單線程模型的原則:Android UI操作并不是線程安全的并且這些操作必須在UI線 程中執行 

2.2 Message Queue

在單線程模型下,為 了解決類似的問題,Android設 計了一個Message Queue(消息隊列), 線程間可以通過該Message Queue并結合HandlerLooper組 件進行信息交換。下面將對它們進行分別介紹:

l  Message Queue

Message Queue是一個消息隊列,用來存放通過Handler發 布的消息。消息隊列通常附屬于某一個創建它的線程,可以通過Looper.myQueue()得 到當前線程的消息隊列。Android在 第一啟動程序時會默認會為UI thread創建一個關聯的消息隊列,用來管理程序的一些上層組件,activitiesbroadcast receivers 等等。你可以在自己的子線程中創建HandlerUI thread通訊。

l  Handler

通過Handler你 可以發布或者處理一個消息或者是一個Runnable的 實例。沒個Handler都 會與唯一的一個線程以及該線程的消息隊列管理。當你創建一個新的Handler時候,默認情況下,它將關聯到創建它的這個線程和該線程的消息隊列。也就是說,如果你通過Handler發 布消息的話,消息將只會發送到與它關聯的這個消息隊列,當然也只能處理該消息隊列中的消息。

主要的方法有:

1)   public final boolean sendMessage(Message msg)

把消息放入該Handler所 關聯的消息隊列,放置在所有當前時間前未被處理的消息后。

2)   public void handleMessage(Message msg)

關聯該消息隊列的線 程將通過調用HandlerhandleMessage方 法來接收和處理消息,通常需要子類化Handler來 實現handleMessage。

l  Looper

Looper扮演著一個Handler和 消息隊列之間通訊橋梁的角色。程序組件首先通過Handler把 消息傳遞給Looper,Looper把 消息放入隊列。Looper也 把消息隊列里的消息廣播給所有的Handler,Handler接 受到消息后調用handleMessage進 行處理。

1)   可以通過Looper類 的靜態方法Looper.myLooper得 到當前線程的Looper實 例,如果當前線程未關聯一個Looper實 例,該方法將返回空。

2)   可以通過靜態方法Looper. getMainLooper方法得到主線程的Looper實 例

線程,消息隊列,HandlerLooper之 間的關系可以通過一個圖來展示:

在了解了消息隊列及 其相關組件的設計思想后,我們將把天氣預報的案例通過消息隊列來重新實現:

在了解了消息隊列及其相關組件的設計思想后,我們將把天氣預報的案例通過消息隊列來重新實現:

private EditText editText;

    private Handler messageHandler;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        editText = (EditText) findViewById(R.id.weather_city_edit);

        Button button = (Button) findViewById(R.id.goQuery);

        button.setOnClickListener(this);

        //得到當前線程 的Looper實例,由于 當前線程是UI線程也可以 通過Looper.getMainLooper()得到

        Looper looper = Looper.myLooper();

        //此處甚至可以 不需要設置Looper,因為 Handler默認就使用當 前線程的Looper

        messageHandler = new MessageHandler(looper);

    }

 

    @Override

    public void onClick(View v) {

        //創建一個子線 程去做耗時的網絡連接工作

        new Thread() {

            @Override

            public void run() {

                //活動用戶輸入 的城市名稱

                String city = editText.getText().toString();

                //調用Google 天氣API查詢指定城 市的當日天氣情況

                String weather = getWetherByCity(city);

                //創建一個Message對象,并把得 到的天氣信息賦值給Message對象

                Message message = Message.obtain();

                message.obj = weather;

                //通過Handler發布攜帶有天 氣情況的消息

                messageHandler.sendMessage(message);

            }

        }.start();

    }

 

    //子類化一個Handler

    class MessageHandler extends Handler {

        public MessageHandler(Looper looper) {

            super(looper);

        }

        @Override

        public void handleMessage(Message msg) {

            //處理收到的消 息,把天氣信息顯示在title

            setTitle((String) msg.obj);

        }

    }

通過消息隊列改寫過后的天氣預報程序已經可以成功運行,因為HandlerhandleMessage方法實 際是由關聯有該消息隊列的UI thread調用,而在UI thread中更新title并沒有違背Android的單線程模型的原 則。

2.3 AsyncTask

雖然借助消息隊列已經可以較為完美的實現了天氣預報的功能,但是你還是不得不自己管理子線程,尤其當你的需要有一些復雜的邏輯以及需要頻繁的更新UI的時候,這樣的方式使得你的代碼難以閱讀和理解。

幸運的是Android另外提供了一個工具類:AsyncTask。它使得UI thread的使用變得異常簡單。它使創建需要與用戶界面交互的長時間運行的任務變得更簡單,不需要借助線程和Handler即可實現。

1)   子類化AsyncTask

2)   實現AsyncTask中定義的下面一個或幾個方法

?  onPreExecute(), 該方法將在執行實際的后臺操作前被UI thread調用??梢栽谠摲椒ㄖ凶鲆恍蕚涔ぷ鳎缭诮缑嫔巷@示一個進度條。

?  doInBackground(Params...), 將在onPreExecute 方法執行后馬上執行,該方法運行在后臺線程中。這里將主要負責執行那些很耗時的后臺計算工作??梢哉{用publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。

?  3. onProgressUpdate(Progress...),publishProgress方 法被調用后,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。

?  4. onPostExecute(Result), doInBackground 執行完成后,onPostExecute 方法將被UI thread調用,后臺的計算結果將通過該方法傳遞到UI thread.

為了正確的使用AsyncTask類,以下是幾條必須遵守的準 則:

1)   Task的實例 必須在UI thread中創建

2)   execute方 法必須在UI thread中調用

3)   不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法

4)   task只能被執行一次,否則多次調用時將會出現異常

下面我們將通過AsyncTask并且嚴格遵守上面的4條準則來改寫天氣預報的例子:

    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       editText = (EditText) findViewById(R.id.weather_city_edit);

       Button button = (Button) findViewById(R.id.goQuery);

       button.setOnClickListener(this);

    }

    public void onClick(View v) {

       //獲得用戶輸 入的城市名稱

       String city = editText.getText().toString();

    //必須每次都 重新創建一個新的task實例進行 查詢,否則將提示如下異常信息

    //the task has already been executed (a task can be executed only once)

       new GetWeatherTask().execute(city);

    }

    class GetWeatherTask extends AsyncTask<String, Integer, String> {

       @Override

       protected String doInBackground(String... params) {

           String city = params[0];

           //調用Google 天氣API查詢指定 城市的當日天氣情況

           return getWetherByCity(city);

       }

       protected void onPostExecute(String result) {

           //doInBackground處理的結果 即天氣信息顯示在title

           setTitle(result);

       }

    } 

注意這行代 碼:new GetWeatherTask().execute(city); 值得一提的是必須每次都重新創建一個新的GetWeatherTask來執行后臺任務,否則Android會提示“a task can be executed only once”的錯誤信息。 

經過改寫后的 程序不僅顯得非常的簡潔,而且還減少了代碼量,大大增強了可讀性和可維護性。因為負責更新UIonPostExecute方 法是由UI thread調用,所以沒有違背單線程模型的原則。良好的AsyncTask設計大大降低了我們犯錯誤的幾率。 

5綜述

    本文首先大致介紹了Android的單線程模型及其原則。然后通過一個真實案例展示剛接觸Android的 開發人員在不理解Android的 單線程模型下容易犯的錯誤。最后通過幾種正確的方式實現該案例,進一步認識和理解Android的單線程模型及其原則。由于更多地關注線程模型,本文或許不足以幫助讀者全面的認識Android技 術,關于文中提到的其他技術細節以及Android的 其他相關技術可以訪問Android的 官方網站進行進一步的了解和學習。

posted on 2010-05-31 11:17 大龍 閱讀(12605) 評論(3)  編輯 收藏 引用

評論

# re: 淺析Android線程模型一 --- 轉 2010-08-22 03:59 xh

謝謝 新手看了這篇文章 很有幫助 謝謝  回復  更多評論   

# re: 淺析Android線程模型一 --- 轉 2012-11-06 10:41 Dream_Fly

很有幫助,謝謝。  回復  更多評論   

# re: 淺析Android線程模型一 --- 轉 2013-03-05 23:01 dophia

真的很好,謝謝!  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品高清免费在线观看| 国产乱理伦片在线观看夜一区| 欧美日本国产在线| 日韩视频一区| 在线亚洲国产精品网站| 欧美激情在线| 欧美激情一区二区| 亚洲综合国产| 欧美中文字幕第一页| 亚洲高清不卡| 亚洲麻豆av| 国产亚洲人成a一在线v站| 欧美a级理论片| 欧美日韩在线视频观看| 欧美一区二区三区在线免费观看| 欧美一级播放| 亚洲精选中文字幕| 亚洲网站在线观看| 在线播放日韩欧美| 艳妇臀荡乳欲伦亚洲一区| 国产欧美日韩中文字幕在线| 欧美gay视频| 欧美日韩中文字幕| 麻豆精品视频在线观看视频| 欧美日韩国产免费观看| 欧美一区国产一区| 欧美国产免费| 久久九九久久九九| 欧美日韩视频一区二区| 久久露脸国产精品| 欧美日韩亚洲系列| 农村妇女精品| 国产精品系列在线播放| 亚洲国产视频a| 国产精品伊人日日| 亚洲精品视频一区二区三区| 国内精品国语自产拍在线观看| 亚洲精品欧美一区二区三区| 永久555www成人免费| 亚洲午夜激情| 一本色道久久88综合亚洲精品ⅰ | 亚洲国产成人av在线| 一区二区三区欧美日韩| 亚洲国产婷婷综合在线精品| 午夜在线视频观看日韩17c| 一本色道久久88综合亚洲精品ⅰ| 久久精品一区二区三区四区 | 国产亚洲欧美一区二区三区| 日韩一级在线| 日韩视频免费在线| 蜜桃久久精品一区二区| 久久先锋影音| 国产一区二区三区在线播放免费观看 | 亚洲欧美在线免费| 欧美视频1区| 亚洲美女尤物影院| 一本一道久久综合狠狠老精东影业 | 在线观看日韩欧美| 日韩视频免费观看高清在线视频 | 国产麻豆日韩欧美久久| 99精品99| 亚洲一区二区在线观看视频| 欧美激情一区二区三区全黄| 欧美激情亚洲一区| 亚洲肉体裸体xxxx137| 免费成人在线观看视频| 亚洲第一精品影视| 亚洲黄色毛片| 欧美激情一区在线| 99精品久久免费看蜜臀剧情介绍| 一本一本久久a久久精品牛牛影视| 欧美精品导航| 一本色道久久综合| 午夜精品福利视频| 国产人成精品一区二区三| 亚洲欧美另类在线| 久久婷婷人人澡人人喊人人爽| 黄色av成人| 欧美chengren| 亚洲乱码视频| 欧美中文字幕精品| 亚洲电影av| 欧美美女日韩| 亚洲欧美激情四射在线日| 久久久久9999亚洲精品| 亚洲成色www久久网站| 欧美不卡视频一区发布| 999在线观看精品免费不卡网站| 亚洲女同在线| 在线观看欧美精品| 欧美日韩三区四区| 欧美一级专区| 亚洲国产欧美精品| 亚洲欧美视频| 亚洲国产精品久久久久秋霞影院 | 91久久综合亚洲鲁鲁五月天| 欧美理论电影网| 亚洲欧美影院| 亚洲福利视频在线| 欧美一区国产在线| 亚洲日本理论电影| 国产精品久久久999| 久久久噜噜噜久久久| 一区二区福利| 欧美激情久久久久| 久久精品视频在线观看| 亚洲美洲欧洲综合国产一区| 91久久精品美女高潮| 欧美一区二区在线看| 亚洲美女黄网| 激情综合久久| 国产精品一区二区三区乱码| 另类人畜视频在线| 欧美一区二区三区四区在线观看 | 一区二区三区国产| 国产亚洲精品久久久| 欧美理论在线| 麻豆av一区二区三区| 欧美亚洲一区三区| 一道本一区二区| 亚洲国产影院| 欧美成人首页| 久热这里只精品99re8久| 一区二区三区你懂的| 亚洲人午夜精品免费| 国内精品国产成人| 国产精品日日摸夜夜摸av| 欧美日韩亚洲一区| 欧美激情女人20p| 国产精品久久91| 欧美激情网友自拍| 久久久亚洲一区| 久久国产精品久久久久久电车| 亚洲尤物视频网| 亚洲影院高清在线| 这里只有精品视频| 亚洲视频欧美在线| 国产精品99久久99久久久二8 | 91久久综合| 亚洲欧洲日本专区| 亚洲人成网站色ww在线| 欧美护士18xxxxhd| 亚洲成人在线视频播放| 欧美国产精品日韩| 亚洲国产视频一区二区| 亚洲日本中文字幕| 99精品热视频只有精品10| 99精品国产高清一区二区| 日韩图片一区| 亚洲男人av电影| 欧美在线观看一区| 久久亚洲综合网| 欧美大胆成人| 欧美日韩一区二区三区四区在线观看| 欧美国产日韩一区二区在线观看| 欧美成人午夜影院| 欧美三级黄美女| 国产欧美二区| 亚洲第一级黄色片| av成人国产| 欧美在线免费视屏| 免费成人在线观看视频| 亚洲第一免费播放区| 亚洲麻豆国产自偷在线| 亚洲一区二区在线播放| 欧美一区二区精品| 久久亚洲欧美国产精品乐播| 欧美精品首页| 国产视频久久| 亚洲免费观看在线视频| 亚洲综合成人在线| 麻豆精品精华液| 99re8这里有精品热视频免费| 亚洲一区区二区| 欧美一区二区在线看| 欧美电影免费观看网站| 一区二区三区|亚洲午夜| 午夜精品一区二区三区在线播放| 久久久久综合网| 欧美日韩一区二区在线视频| 国产在线拍偷自揄拍精品| 亚洲人成网站在线观看播放| 亚洲女同同性videoxma| 欧美激情bt| 亚洲一级片在线看| 欧美不卡一区| 国产有码在线一区二区视频| 中文在线资源观看网站视频免费不卡 | 欧美日本高清视频| 在线精品国产成人综合| 亚洲欧美日韩中文视频| 亚洲国产精品嫩草影院| 亚洲理论电影网| 亚洲精品日产精品乱码不卡| 久久精品道一区二区三区| 亚洲免费不卡| 欧美成人黄色小视频| 国精品一区二区三区| 羞羞漫画18久久大片| 亚洲免费观看高清完整版在线观看熊 |