中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Android多線程實(shí)現(xiàn)文件斷點(diǎn)下載

2018-07-20    來(lái)源:open-open

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

download_main_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


    <EditText
        android:id="@+id/down_load_edt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="請(qǐng)輸入下載文件的網(wǎng)址!" />


    <Button
        android:layout_marginTop="20dp"
        android:id="@+id/down_load_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="點(diǎn)擊下載" />


    <ProgressBar
        android:id="@+id/down_load_pbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>



下載入口Activity:

public class MainActivity extends Activity implements OnClickListener {
/**下載文件按鈕 */
private Button downLoadBtn;
/**下載文件地址 */
private EditText downLoadEdt;
/**下載進(jìn)度 */
private ProgressBar downLoadPbar;
/**定義發(fā)送消息的字段*/
private static final int MESSAGE_NUMBER = 1;
/**所要下載文件總大小 */
private int fileSize;
/**已下載大小 */
private int downLoadSize;
/**所下載文件的保存路徑 */
private String path;
/**更新進(jìn)度條的值 */
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == MESSAGE_NUMBER) {
/**設(shè)置進(jìn)度*/
downLoadPbar.setProgress(Double.valueOf(downLoadSize * 1.0 / fileSize * 100).intValue());
}
}


};


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download_activity_main);
findViews();
setListeners();
initdata();
}


private void findViews() {
downLoadEdt=(EditText) findViewById(R.id.down_load_edt);
downLoadBtn = (Button) findViewById(R.id.down_load_btn);
downLoadPbar = (ProgressBar) findViewById(R.id.down_load_pbar);
}


private void setListeners() {
downLoadBtn.setOnClickListener(this);
}


private void initdata() {
downLoadPbar.setVisibility(View.GONE);
downLoadPbar.setMax(100);
downLoadPbar.setProgress(0);
}


@Override
public void onClick(View v) {
/**獲取SDcard */
path = Environment.getExternalStorageDirectory() + "/downloads/";
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
/**下載操作 */
new Thread(new DownLoadTask()).start();
/**顯示進(jìn)度條 */
downLoadPbar.setVisibility(View.VISIBLE);
}


/**子線程,計(jì)算下載量,更新UI */
class DownLoadTask implements Runnable {
/**線程塊大小,每個(gè)線程的下載量 */
private int blockSize;
/** 默認(rèn)為5個(gè)線程 */
private int threadNum = 5;
/** 下載后的文件名 */
private String fileName = "myDownLoad.zip";


@Override
public void run() {
/**數(shù)組保存線程對(duì)象,便于后面的每個(gè)線程下載量計(jì)算總和 */
DownLoadThread[] fileDownLoads = new DownLoadThread[threadNum];
/** 計(jì)算總大小 */
URL url;
try {
url = new URL(downLoadEdt.getText().toString().trim());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
/**計(jì)算下載量 */
fileSize = conn.getContentLength();
/** 計(jì)算每個(gè)線程的下載量 */
blockSize = fileSize / threadNum;
/** 執(zhí)行下載操作 */
for (int i = 0; i < threadNum; i++) {
/** 每個(gè)線程的開(kāi)始位置 */
int begin = i * blockSize;
/** 每個(gè)線程的結(jié)束位置 */
int end = (i + 1) * blockSize - 1;
DownLoadThread thread = new DownLoadThread(url, begin, end, path + fileName);
thread.start();
fileDownLoads[i] = thread;
}


/** 更新UI */
boolean flag = false;
while (!flag) {
flag = true;
for (int i = 0; i < threadNum; i++) {
downLoadSize += fileDownLoads[i].getDownloadsize();
if (!fileDownLoads[i].isFinish()) {
flag = false;
}
}
MainActivity.this.handler.sendEmptyMessage(MESSAGE_NUMBER);
Thread.sleep(1000);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

下載線程工具類(lèi):

public class DownLoadThread extends Thread {
/**文件年在Url*/
private URL url;
/**文件下載開(kāi)始位置*/
private int startPostion;
/**文件下載結(jié)束位置*/
private int endPostion;
/**文件下載當(dāng)前位置*/
private int currentPostion;
/**文件名*/
private String filename;
/**緩沖輸入流*/
private BufferedInputStream buffin;
/**寫(xiě)入流,支持?jǐn)帱c(diǎn)*/
private RandomAccessFile raf;
/**緩沖大小*/
byte[] buffsize = new byte[1024];
/**已經(jīng)下載大小*/
private int downloadsize;
/**下載是否完成*/
private boolean isFinish;

public int getDownloadsize() {
return downloadsize;
}
public boolean isFinish() {
return isFinish;
}


public DownLoadThread(URL url, int begin, int end, String filename) {
super();
this.url = url;
this.startPostion = begin;
this.endPostion = end;
this.filename = filename;
}
@Override
public void run() {
try {
/**
* 抽象類(lèi) URLConnection 是所有類(lèi)的超類(lèi),它代表應(yīng)用程序和 URL 之間的通信鏈接。此類(lèi)的實(shí)例可用于讀取和寫(xiě)入此 URL 引用的資源。通常,創(chuàng)建一個(gè)到 URL 的連接需要幾個(gè)步驟: 
* openConnection() connect()對(duì)影響到遠(yuǎn)程資源連接的參數(shù)進(jìn)行操作。 與資源交互;查詢(xún)頭字段和內(nèi)容。 
* 通過(guò)在 URL 上調(diào)用 openConnection 方法創(chuàng)建連接對(duì)象。 處理設(shè)置參數(shù)和一般請(qǐng)求屬性。 使用 connect 方法建立到遠(yuǎn)程對(duì)象的實(shí)際連接。 遠(yuǎn)程對(duì)象變?yōu)榭捎。遠(yuǎn)程對(duì)象的頭字段和內(nèi)容變?yōu)榭稍L問(wèn)。 
*/
URLConnection conn = url.openConnection();
/**指定下載的范圍*/
conn.setRequestProperty("Range", "bytes="+startPostion+"-"+endPostion);
/**此URL將在一定的上下文環(huán)境中被檢驗(yàn),是否允許用戶(hù)交互,比如彈出一個(gè)認(rèn)證對(duì)話框。如果為 false,那么不允許用戶(hù)交互。*/
conn.setAllowUserInteraction(true);
/**做緩沖優(yōu)化處理*/
buffin = new BufferedInputStream(conn.getInputStream());
/**寫(xiě)入本地文件*/
raf = new RandomAccessFile(new File(filename), "rw");
/**移動(dòng)到新的位置*/
raf.seek(startPostion);

while(currentPostion<endPostion){//如果當(dāng)前下載沒(méi)有結(jié)束
int size = buffin.read(buffsize, 0, 1024);
/**已經(jīng)讀完*/
if(size==-1){
break;
}
raf.write(buffsize, 0, size);
currentPostion+=size;
/**下載量*/
downloadsize+=size;
}
isFinish = true;
/**下載完成就要關(guān)閉輸入流與寫(xiě)入流*/
buffin.close();
raf.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.run();
}


}


不要忘記在清單文件AndroidManifest.xml中設(shè)置相應(yīng)權(quán)限:

 <!-- 網(wǎng)絡(luò)訪問(wèn)權(quán)限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- sdcard權(quán)限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

標(biāo)簽: 權(quán)限 通信 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇: Android應(yīng)用自定義圓角圖片RoundImageView

下一篇:Spring4 MVC Hibernate4集成