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

life02

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks
http://blog.csdn.net/furongkang/article/details/6838521


111
Android開發(fā)多線程斷點(diǎn)續(xù)傳下載器
分類: Android 
2011-10-01 23:14 931人閱讀 評(píng)論(8) 收藏 舉報(bào)

使用多線程斷點(diǎn)續(xù)傳下載器在下載的時(shí)候多個(gè)線程并發(fā)可以占用服務(wù)器端更多資源,從而加快下載速度,在下載過(guò)程中記錄每個(gè)線程已拷貝數(shù)據(jù)的數(shù)量,如果下載中斷,比如無(wú)信號(hào)斷線、電量不足等情況下,這就需要使用到斷點(diǎn)續(xù)傳功能,下次啟動(dòng)時(shí)從記錄位置繼續(xù)下載,可避免重復(fù)部分的下載。這里采用數(shù)據(jù)庫(kù)來(lái)記錄下載的進(jìn)度。

效果圖

       

 

斷點(diǎn)續(xù)傳

1.斷點(diǎn)續(xù)傳需要在下載過(guò)程中記錄每條線程的下載進(jìn)度

2.每次下載開始之前先讀取數(shù)據(jù)庫(kù),查詢是否有未完成的記錄,有就繼續(xù)下載,沒有則創(chuàng)建新記錄插入數(shù)據(jù)庫(kù)

3.在每次向文件中寫入數(shù)據(jù)之后,在數(shù)據(jù)庫(kù)中更新下載進(jìn)度

4.下載完成之后刪除數(shù)據(jù)庫(kù)中下載記錄

Handler傳輸數(shù)據(jù)

這個(gè)主要用來(lái)記錄百分比,每下載一部分?jǐn)?shù)據(jù)就通知主線程來(lái)記錄時(shí)間

1.主線程中創(chuàng)建的View只能在主線程中修改,其他線程只能通過(guò)和主線程通信,在主線程中改變View數(shù)據(jù)

2.我們使用Handler可以處理這種需求

   主線程中創(chuàng)建Handler,重寫handleMessage()方法

   新線程中使用Handler發(fā)送消息,主線程即可收到消息,并且執(zhí)行handleMessage()方法

動(dòng)態(tài)生成新View

可實(shí)現(xiàn)多任務(wù)下載

1.創(chuàng)建XML文件,將要生成的View配置好

2.獲取系統(tǒng)服務(wù)LayoutInflater,用來(lái)生成新的View

   LayoutInflater inflater 
= (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

3.使用inflate(int resource, ViewGroup root)方法生成新的View

4.調(diào)用當(dāng)前頁(yè)面中某個(gè)容器的addView,將新創(chuàng)建的View添加進(jìn)來(lái)

示例

進(jìn)度條樣式 download.xml
[html] view plaincopy

    
<?xml version="1.0" encoding="utf-8"?>  
    
<LinearLayout   
        xmlns:android
="http://schemas.android.com/apk/res/android"  
        android:layout_width
="fill_parent"  
        android:layout_height
="wrap_content"  
        
>  
        
<LinearLayout   
            android:orientation
="vertical"  
            android:layout_width
="fill_parent"  
            android:layout_height
="wrap_content"  
            android:layout_weight
="1"  
            
>  
            
<!--進(jìn)度條樣式默認(rèn)為圓形進(jìn)度條,水平進(jìn)度條需要配置style屬性,  
            
?android:attr/progressBarStyleHorizontal -->  
            
<ProgressBar  
                android:layout_width
="fill_parent"   
                android:layout_height
="20dp"  
                style
="?android:attr/progressBarStyleHorizontal"  
                
/>  
            
<TextView  
                android:layout_width
="wrap_content"   
                android:layout_height
="wrap_content"  
                android:layout_gravity
="center"  
                android:text
="0%"  
                
/>  
        
</LinearLayout>  
        
<Button  
            android:layout_width
="40dp"  
            android:layout_height
="40dp"  
            android:onClick
="pause"  
            android:text
="||"  
            
/>  
    
</LinearLayout>  

頂部樣式 main.xml
[html] view plaincopy

    
<?xml version="1.0" encoding="utf-8"?>  
    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation
="vertical"  
        android:layout_width
="fill_parent"  
        android:layout_height
="fill_parent"  
        android:id
="@+id/root"  
        
>  
        
<TextView    
            android:layout_width
="fill_parent"   
            android:layout_height
="wrap_content"   
            android:text
="請(qǐng)輸入下載路徑"  
            
/>  
        
<LinearLayout   
            android:layout_width
="fill_parent"  
            android:layout_height
="wrap_content"  
            android:layout_marginBottom
="30dp"  
            
>  
            
<EditText  
                android:id
="@+id/path"  
                android:layout_width
="fill_parent"   
                android:layout_height
="wrap_content"   
                android:singleLine
="true"  
                android:layout_weight
="1"  
                
/>  
            
<Button  
                android:layout_width
="wrap_content"   
                android:layout_height
="wrap_content"   
                android:text
="下載"  
                android:onClick
="download"  
                
/>  
        
</LinearLayout>  
    
</LinearLayout>  
       

MainActivity.java
[java] view plaincopy

    
public class MainActivity extends Activity {  
        
private LayoutInflater inflater;  
        
private LinearLayout rootLinearLayout;  
        
private EditText pathEditText;  
      
        @Override  
        
public void onCreate(Bundle savedInstanceState) {  
            
super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
      
            
//動(dòng)態(tài)生成新View,獲取系統(tǒng)服務(wù)LayoutInflater,用來(lái)生成新的View  
            inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
            rootLinearLayout 
= (LinearLayout) findViewById(R.id.root);  
            pathEditText 
= (EditText) findViewById(R.id.path);  
      
            
// 窗體創(chuàng)建之后, 查詢數(shù)據(jù)庫(kù)是否有未完成任務(wù), 如果有, 創(chuàng)建進(jìn)度條等組件, 繼續(xù)下載  
            List<String> list = new InfoDao(this).queryUndone();  
            
for (String path : list)  
                createDownload(path);  
        }  
      
        
/** 
         * 下載按鈕 
         * 
@param view 
         
*/  
        
public void download(View view) {  
            String path 
= "http://192.168.1.199:8080/14_Web/" + pathEditText.getText().toString();  
            createDownload(path);  
        }  
      
        
/** 
         * 動(dòng)態(tài)生成新View 
         * 初始化表單數(shù)據(jù) 
         * 
@param path 
         
*/  
        
private void createDownload(String path) {  
            
//獲取系統(tǒng)服務(wù)LayoutInflater,用來(lái)生成新的View  
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
            LinearLayout linearLayout 
= (LinearLayout) inflater.inflate(R.layout.download, null);  
              
            LinearLayout childLinearLayout 
= (LinearLayout) linearLayout.getChildAt(0);  
            ProgressBar progressBar 
= (ProgressBar) childLinearLayout.getChildAt(0);  
            TextView textView 
= (TextView) childLinearLayout.getChildAt(1);  
            Button button 
= (Button) linearLayout.getChildAt(1);  
      
            
try {  
                button.setOnClickListener(
new MyListener(progressBar, textView, path));  
                
//調(diào)用當(dāng)前頁(yè)面中某個(gè)容器的addView,將新創(chuàng)建的View添加進(jìn)來(lái)  
                rootLinearLayout.addView(linearLayout);  
            } 
catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
      
        
private final class MyListener implements OnClickListener {  
            
private ProgressBar progressBar;  
            
private TextView textView;  
            
private int fileLen;  
            
private Downloader downloader;  
            
private String name;  
              
            
/** 
             * 執(zhí)行下載 
             * 
@param progressBar //進(jìn)度條 
             * 
@param textView //百分比 
             * 
@param path  //下載文件路徑 
             
*/  
            
public MyListener(ProgressBar progressBar, TextView textView, String path) {  
                
this.progressBar = progressBar;  
                
this.textView = textView;  
                name 
= path.substring(path.lastIndexOf("/"+ 1);  
      
                downloader 
= new Downloader(getApplicationContext(), handler);  
                
try {  
                    downloader.download(path, 
3);  
                } 
catch (Exception e) {  
                    e.printStackTrace();  
                    Toast.makeText(getApplicationContext(), 
"下載過(guò)程中出現(xiàn)異常"0).show();  
                    
throw new RuntimeException(e);  
                }  
            }  
              
            
//Handler傳輸數(shù)據(jù)  
            private Handler handler = new Handler() {  
                @Override  
                
public void handleMessage(Message msg) {  
                    
switch (msg.what) {  
                        
case 0:  
                            
//獲取文件的大小  
                            fileLen = msg.getData().getInt("fileLen");  
                            
//設(shè)置進(jìn)度條最大刻度:setMax()  
                            progressBar.setMax(fileLen);  
                            
break;  
                        
case 1:  
                            
//獲取當(dāng)前下載的總量  
                            int done = msg.getData().getInt("done");  
                            
//當(dāng)前進(jìn)度的百分比  
                            textView.setText(name + "\t" + done * 100 / fileLen + "%");  
                            
//進(jìn)度條設(shè)置當(dāng)前進(jìn)度:setProgress()  
                            progressBar.setProgress(done);  
                            
if (done == fileLen) {  
                                Toast.makeText(getApplicationContext(), name 
+ " 下載完成"0).show();  
                                
//下載完成后退出進(jìn)度條  
                                rootLinearLayout.removeView((View) progressBar.getParent().getParent());  
                            }  
                            
break;  
                    }  
                }  
            };  
      
            
/** 
             * 暫停和繼續(xù)下載 
             
*/  
            
public void onClick(View v) {  
                Button pauseButton 
= (Button) v;  
                
if ("||".equals(pauseButton.getText())) {  
                    downloader.pause();  
                    pauseButton.setText(
"");  
                } 
else {  
                    downloader.resume();  
                    pauseButton.setText(
"||");  
                }  
            }  
        }  
    }  



Downloader.java
[java] view plaincopy

    
public class Downloader {  
      
        
private int done;  
        
private InfoDao dao;  
        
private int fileLen;  
        
private Handler handler;  
        
private boolean isPause;  
      
        
public Downloader(Context context, Handler handler) {  
            dao 
= new InfoDao(context);  
            
this.handler = handler;  
        }  
        
/** 
         * 多線程下載 
         * 
@param path 下載路徑 
         * 
@param thCount 需要開啟多少個(gè)線程 
         * 
@throws Exception 
         
*/  
        
public void download(String path, int thCount) throws Exception {  
            URL url 
= new URL(path);  
            HttpURLConnection conn 
= (HttpURLConnection) url.openConnection();  
            
//設(shè)置超時(shí)時(shí)間  
            conn.setConnectTimeout(3000);  
            
if (conn.getResponseCode() == 200) {  
                fileLen 
= conn.getContentLength();  
                String name 
= path.substring(path.lastIndexOf("/"+ 1);  
                File file 
= new File(Environment.getExternalStorageDirectory(), name);  
                RandomAccessFile raf 
= new RandomAccessFile(file, "rws");  
                raf.setLength(fileLen);  
                raf.close();  
                  
                
//Handler發(fā)送消息,主線程接收消息,獲取數(shù)據(jù)的長(zhǎng)度  
                Message msg = new Message();  
                msg.what 
= 0;  
                msg.getData().putInt(
"fileLen", fileLen);  
                handler.sendMessage(msg);  
                  
                
//計(jì)算每個(gè)線程下載的字節(jié)數(shù)  
                int partLen = (fileLen + thCount - 1/ thCount;  
                
for (int i = 0; i < thCount; i++)  
                    
new DownloadThread(url, file, partLen, i).start();  
            } 
else {  
                
throw new IllegalArgumentException("404 path: " + path);  
            }  
        }  
      
        
private final class DownloadThread extends Thread {  
            
private URL url;  
            
private File file;  
            
private int partLen;  
            
private int id;  
      
            
public DownloadThread(URL url, File file, int partLen, int id) {  
                
this.url = url;  
                
this.file = file;  
                
this.partLen = partLen;  
                
this.id = id;  
            }  
      
            
/** 
             * 寫入操作 
             
*/  
            
public void run() {  
                
// 判斷上次是否有未完成任務(wù)  
                Info info = dao.query(url.toString(), id);  
                
if (info != null) {  
                    
// 如果有, 讀取當(dāng)前線程已下載量  
                    done += info.getDone();  
                } 
else {  
                    
// 如果沒有, 則創(chuàng)建一個(gè)新記錄存入  
                    info = new Info(url.toString(), id, 0);  
                    dao.insert(info);  
                }  
      
                
int start = id * partLen + info.getDone(); // 開始位置 += 已下載量  
                int end = (id + 1* partLen - 1;  
      
                
try {  
                    HttpURLConnection conn 
= (HttpURLConnection) url.openConnection();  
                    conn.setReadTimeout(
3000);  
                    
//獲取指定位置的數(shù)據(jù),Range范圍如果超出服務(wù)器上數(shù)據(jù)范圍, 會(huì)以服務(wù)器數(shù)據(jù)末尾為準(zhǔn)  
                    conn.setRequestProperty("Range""bytes=" + start + "-" + end);  
                    RandomAccessFile raf 
= new RandomAccessFile(file, "rws");  
                    raf.seek(start);  
                    
//開始讀寫數(shù)據(jù)  
                    InputStream in = conn.getInputStream();  
                    
byte[] buf = new byte[1024 * 10];  
                    
int len;  
                    
while ((len = in.read(buf)) != -1) {  
                        
if (isPause) {  
                            
//使用線程鎖鎖定該線程  
                            synchronized (dao) {  
                                
try {  
                                    dao.wait();  
                                } 
catch (InterruptedException e) {  
                                    e.printStackTrace();  
                                }  
                            }  
                        }  
                        raf.write(buf, 
0, len);  
                        done 
+= len;  
                        info.setDone(info.getDone() 
+ len);  
                        
// 記錄每個(gè)線程已下載的數(shù)據(jù)量  
                        dao.update(info);   
                        
//新線程中用Handler發(fā)送消息,主線程接收消息  
                        Message msg = new Message();  
                        msg.what 
= 1;  
                        msg.getData().putInt(
"done", done);  
                        handler.sendMessage(msg);  
                    }  
                    in.close();  
                    raf.close();  
                    
// 刪除下載記錄  
                    dao.deleteAll(info.getPath(), fileLen);   
                } 
catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
      
        
//暫停下載  
        public void pause() {  
            isPause 
= true;  
        }  
        
//繼續(xù)下載  
        public void resume() {  
            isPause 
= false;  
            
//恢復(fù)所有線程  
            synchronized (dao) {  
                dao.notifyAll();  
            }  
        }  
    }  

 

 

Dao:

 

DBOpenHelper:
[java] view plaincopy

    
public class DBOpenHelper extends SQLiteOpenHelper {  
      
        
public DBOpenHelper(Context context) {  
            
super(context, "download.db"null1);  
        }  
      
        @Override  
        
public void onCreate(SQLiteDatabase db) {  
            db.execSQL(
"CREATE TABLE info(path VARCHAR(1024), thid INTEGER, done INTEGER, PRIMARY KEY(path, thid))");  
        }  
      
        @Override  
        
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
        }  
      
    }  


InfoDao:
[java] view plaincopy

    
public class InfoDao {  
        
private DBOpenHelper helper;  
      
        
public InfoDao(Context context) {  
            helper 
= new DBOpenHelper(context);  
        }  
      
        
public void insert(Info info) {  
            SQLiteDatabase db 
= helper.getWritableDatabase();  
            db.execSQL(
"INSERT INTO info(path, thid, done) VALUES(?, ?, ?)"new Object[] { info.getPath(), info.getThid(), info.getDone() });  
        }  
      
        
public void delete(String path, int thid) {  
            SQLiteDatabase db 
= helper.getWritableDatabase();  
            db.execSQL(
"DELETE FROM info WHERE path=? AND thid=?"new Object[] { path, thid });  
        }  
      
        
public void update(Info info) {  
            SQLiteDatabase db 
= helper.getWritableDatabase();  
            db.execSQL(
"UPDATE info SET done=? WHERE path=? AND thid=?"new Object[] { info.getDone(), info.getPath(), info.getThid() });  
        }  
      
        
public Info query(String path, int thid) {  
            SQLiteDatabase db 
= helper.getWritableDatabase();  
            Cursor c 
= db.rawQuery("SELECT path, thid, done FROM info WHERE path=? AND thid=?"new String[] { path, String.valueOf(thid) });  
            Info info 
= null;  
            
if (c.moveToNext())  
                info 
= new Info(c.getString(0), c.getInt(1), c.getInt(2));  
            c.close();  
      
            
return info;  
        }  
      
        
public void deleteAll(String path, int len) {  
            SQLiteDatabase db 
= helper.getWritableDatabase();  
            Cursor c 
= db.rawQuery("SELECT SUM(done) FROM info WHERE path=?"new String[] { path });  
            
if (c.moveToNext()) {  
                
int result = c.getInt(0);  
                
if (result == len)  
                    db.execSQL(
"DELETE FROM info WHERE path=? "new Object[] { path });  
            }  
        }  
      
        
public List<String> queryUndone() {  
            SQLiteDatabase db 
= helper.getWritableDatabase();  
            Cursor c 
= db.rawQuery("SELECT DISTINCT path FROM info"null);  
            List
<String> pathList = new ArrayList<String>();  
            
while (c.moveToNext())  
                pathList.add(c.getString(
0));  
            c.close();  
            
return pathList;  
        }  
      
    }  



posted on 2012-04-02 14:50 life02 閱讀(1730) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Android開發(fā)

評(píng)論

# re: Android開發(fā)多線程斷點(diǎn)續(xù)傳下載器 (轉(zhuǎn)載) 2012-04-02 14:52 life02
http://download.csdn.net/download/suijing/3114607  回復(fù)  更多評(píng)論
  

# re: Android開發(fā)多線程斷點(diǎn)續(xù)傳下載器 (轉(zhuǎn)載) 2012-09-13 15:29 25Age
這個(gè)handler是不是只能放在外面?
還有哪些地方 。  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品www网站| 在线观看91精品国产麻豆| 亚洲午夜伦理| 在线日韩欧美| 亚洲黄网站在线观看| 亚洲高清在线观看一区| 亚洲国产成人精品视频| 91久久国产自产拍夜夜嗨| 亚洲日本中文字幕| av成人激情| 亚洲欧美制服中文字幕| 亚洲免费在线观看视频| 久久www免费人成看片高清 | 欧美日韩一区自拍| 欧美日韩一二区| 国产精品美女主播| 国语自产精品视频在线看抢先版结局| 黄色成人免费观看| 亚洲天堂成人在线观看| 久久久一区二区| 亚洲激情在线激情| 亚洲一区二区免费看| 欧美影院一区| 欧美激情在线狂野欧美精品| 国产精品久久久久国产a级| 亚洲精品日产精品乱码不卡| 9i看片成人免费高清| 亚洲一二三区视频在线观看| 欧美影院精品一区| 久久性天堂网| 99pao成人国产永久免费视频| 亚洲欧美美女| 欧美另类变人与禽xxxxx| 国产午夜精品久久| 亚洲区一区二区三区| 小处雏高清一区二区三区| 免费观看在线综合色| 亚洲午夜激情免费视频| 欧美成人久久| 影院欧美亚洲| 久久精品123| 亚洲毛片在线看| 亚洲东热激情| 亚洲欧美国产精品va在线观看| 久久精品国产久精国产爱| 亚洲国产乱码最新视频| 亚洲免费人成在线视频观看| 欧美高清一区| 91久久精品日日躁夜夜躁国产| 欧美激情一区| 亚洲一卡久久| 久久综合网色—综合色88| 亚洲欧洲日夜超级视频| 久久精品官网| 国产一区二区你懂的| 中文在线一区| 欧美成人精品1314www| 亚洲人被黑人高潮完整版| 欧美一区三区三区高中清蜜桃 | 免费av成人在线| 激情综合色综合久久| 久久久成人网| 久久精品国产2020观看福利| 国产欧美亚洲精品| 午夜精品免费在线| 亚洲天堂免费观看| 国产精品theporn| 午夜精品久久久久久久久久久 | 一个色综合导航| 欧美日韩一区二区三区免费看| 99亚洲伊人久久精品影院红桃| 亚洲国产高潮在线观看| 欧美成人自拍| 亚洲一级一区| 亚洲欧美一区二区三区久久 | 亚洲精品女av网站| 亚洲国产一区二区在线| 欧美精品在线免费播放| 亚洲天堂av在线免费观看| 日韩亚洲成人av在线| 欧美性猛交xxxx乱大交蜜桃| 欧美一区二区视频97| 香蕉乱码成人久久天堂爱免费 | 国产日韩欧美二区| 久久久久久国产精品mv| 久久人人97超碰精品888| 亚洲国内欧美| 日韩一级不卡| 国产日韩欧美夫妻视频在线观看| 久久免费视频网站| 欧美凹凸一区二区三区视频| 亚洲一区二区三区精品视频| 亚洲欧美日韩精品久久亚洲区| 免费在线成人av| 麻豆亚洲精品| 亚洲乱码国产乱码精品精98午夜| 亚洲黄色在线| 欧美日韩不卡合集视频| 午夜精品在线观看| 午夜影院日韩| 亚洲乱亚洲高清| 亚洲性夜色噜噜噜7777| 激情欧美日韩一区| 亚洲精品视频一区| 国产一区二区三区无遮挡| 亚洲国产小视频在线观看| 国产欧美日韩精品丝袜高跟鞋| 美女视频网站黄色亚洲| 欧美精品在线极品| 久久久99免费视频| 欧美精品在线播放| 久久综合图片| 国产精品久久久一区麻豆最新章节| 免费中文日韩| 国产欧美日韩亚洲精品| 亚洲精品男同| 亚洲电影一级黄| 午夜精品区一区二区三| 日韩视频专区| 亚洲香蕉网站| 免费观看国产成人| 久久嫩草精品久久久久| 国产精品第一区| 亚洲精品中文字幕在线观看| 尤物yw午夜国产精品视频明星| 宅男在线国产精品| 亚洲精选在线| 欧美成人嫩草网站| 久久久99爱| 国产欧美精品国产国产专区| 亚洲天堂av图片| 亚洲一区二区三区午夜| 欧美日韩亚洲一区二区三区四区| 美女视频黄 久久| 狠狠色狠狠色综合| 欧美一级电影久久| 午夜精品福利一区二区三区av | 一区二区欧美视频| 欧美成人四级电影| 亚洲第一区在线观看| 在线观看欧美黄色| 久久一区免费| 欧美高清视频在线| 在线不卡免费欧美| 久久午夜电影| 亚洲电影下载| 亚洲精品午夜精品| 欧美另类高清视频在线| 亚洲免费观看视频| 亚洲午夜一区二区三区| 国产精品狼人久久影院观看方式| 一区二区精品在线观看| 午夜日韩视频| 国产视频久久久久久久| 久久不射电影网| 欧美激情精品久久久久久变态 | 91久久精品久久国产性色也91| 亚洲国产日韩欧美在线动漫| 免费欧美在线| 亚洲精品欧洲| 欧美一区二区三区四区在线观看地址| 国产欧美一区二区三区在线看蜜臀 | 在线电影一区| 欧美另类高清视频在线| 亚洲视频视频在线| 久久久人成影片一区二区三区 | 亚洲国产婷婷| 国产精品高潮粉嫩av| 欧美中文字幕在线| 亚洲韩国一区二区三区| 亚洲资源av| 亚洲国产精品尤物yw在线观看| 亚洲视频一区| 国内成+人亚洲+欧美+综合在线| 久久久不卡网国产精品一区| 欧美电影免费网站| 一区二区欧美激情| 国产一区二区三区奇米久涩 | 免费高清在线视频一区·| 亚洲免费观看视频| 欧美日韩综合精品| 久久乐国产精品| 亚洲精品美女在线观看播放| 久久久精品国产免费观看同学| 亚洲免费av电影| 国产综合欧美| 国产精品国产成人国产三级| 久久资源在线| 午夜一区在线| 在线视频你懂得一区| 亚洲电影网站| 狂野欧美一区| 欧美在线啊v| 亚洲一区日韩在线| 亚洲黄一区二区| 国内精品视频666| 欧美色图天堂网| 欧美国产日韩一区二区| 久久综合九色欧美综合狠狠| 午夜精品福利一区二区蜜股av|