最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實現(xiàn)網(wǎng)絡(luò)多線程斷點續(xù)傳下載功能

 更新時間:2017年03月28日 08:01:34   作者:liu_xiaohuan  
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)網(wǎng)絡(luò)多線程斷點續(xù)傳下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們編寫的是Andorid的HTTP協(xié)議多線程斷點下載應(yīng)用程序。直接使用單線程下載HTTP文件對我們來說是一件非常簡單的事。那么,多線程斷點需要什么功能?

1.多線程下載
2.支持?jǐn)帱c

使用多線程的好處:使用多線程下載會提升文件下載的速度

原理

多線程下載的原理就是將要下載的文件分成若干份,其中每份都使用一個單獨的線程進(jìn)行下載,這樣對于文件的下載速度自然就提高了許多。

既然要分成若干部分分工下載,自然要知道各個線程自己要下載的起始位置,與要下載的大小。所以我們要解決線程的分配與各個線程定位到下載的位置。

封裝

對于多線程下載我們可以將其封裝到一個工具類中DownUtil,向其中傳入下載的鏈接、文件存儲路徑、需要下載的線程數(shù)

分配線程

這里通過HttpURLConnection進(jìn)行網(wǎng)絡(luò)請求下載,通過getContentLength()方法獲取下載文件的總大小,再對其平均分配各個線程需要下載的大小。這樣就確定了下載的大小,下面就是定位到各個線程的開始位置進(jìn)行下載,這里可以使用RandomAccessFile來追蹤定位到要下載的位置,它的seek()方法可以進(jìn)行定位。

線程下載

下面就是各個線程的下載DownThread,上面已經(jīng)得到了各個線程要下載的初始位置,所以可以通過獲取網(wǎng)絡(luò)請求的輸入流InputStream,通過skip()方法跳躍到指定位置進(jìn)行讀取數(shù)據(jù),再寫入到RandomAccessFile文件中

一、 編寫基本的UI,三個TextView,分別顯示文件名、下載進(jìn)度和下載速度,一個ProgressBar。二個Button,分別用于開始下載、暫停下載和取消下載。

<?xml version="1.0" encoding="utf-8"?>
<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"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.example.linux.continuedownload.MainActivity">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
  <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

  <TextView
    android:layout_marginLeft="80dp"
    android:id="@+id/progress"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

  <TextView
    android:layout_marginLeft="80dp"
    android:id="@+id/speed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
  </LinearLayout>
  <ProgressBar
    android:visibility="invisible"
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
      android:id="@+id/start"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="開始下載" />

    <Button
      android:layout_marginLeft="20dp"
      android:id="@+id/stop"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="暫停下載" />

    <Button
      android:layout_marginLeft="20dp"
      android:id="@+id/cancel"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="取消下載" />
  </LinearLayout>

</LinearLayout>

在onCreate方法中綁定開始下載按鈕事件:點擊start按鈕,設(shè)置進(jìn)度條可見,并且設(shè)置start的Action,啟動服務(wù)。

startButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    textView.setText(fileInfo.getFileName());
    progressBar.setVisibility(View.VISIBLE);
    // 通過Intent傳遞參數(shù)給service
    Intent intent = new Intent(MainActivity.this, DownloadService.class);
    intent.setAction(DownloadService.ACTION_START);
    intent.putExtra("fileInfo", fileInfo);
    startService(intent);
  }
});

在onCreate方法中綁定暫停下載按鈕事件:點擊stop按鈕,設(shè)置stop的Action,啟動服務(wù)。

stopButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // 通過Intent傳遞參數(shù)給service
    Intent intent = new Intent(MainActivity.this, DownloadService.class);
    intent.setAction(DownloadService.ACTION_STOP);
    intent.putExtra("fileInfo", fileInfo);
    startService(intent);
  }
});

在onCreate方法中綁定取消下載按鈕事件:點擊cancel按鈕,設(shè)置cancel的Action,啟動服務(wù),之后更新UI。

cancelButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // 通過Intent傳遞參數(shù)給service
    Intent intent = new Intent(MainActivity.this, DownloadService.class);
    intent.setAction(DownloadService.ACTION_CANCEL);
    intent.putExtra("fileInfo", fileInfo);
    startService(intent);

    // 更新textView和progressBar的顯示UI
    textView.setText("");
    progressBar.setVisibility(View.INVISIBLE);
    progressView.setText("");
    speedView.setText("");
  }
});

注冊廣播,用于Service向Activity傳遞一些下載進(jìn)度信息:

// 靜態(tài)注冊廣播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(DownloadService.ACTION_UPDATE);
registerReceiver(broadcastReceiver, intentFilter);

/**
 * 更新UI
 */
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (DownloadService.ACTION_UPDATE.equals(intent.getAction())) {
      int finished = intent.getIntExtra("finished", 0);
      int speed = intent.getIntExtra("speed", 0);

      Log.i("Main", finished + "");
      progressBar.setProgress(finished);
      progressView.setText(finished + "%");
      speedView.setText(speed + "KB/s");
    }
  }
};

三、 在AndroidManifest.xm文件中聲明權(quán)限,定義服務(wù)

<service android:name="com.huhx.services.DownloadService" android:exported="true" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


總結(jié)

多線程的關(guān)鍵就是分配好需要下載的進(jìn)程,定位進(jìn)程下載的準(zhǔn)確位置,獲取輸入流讀取數(shù)據(jù),同時寫入到文件的相應(yīng)位置??梢越柚鶵andomAccessFile來進(jìn)行定位。

當(dāng)然也并非開的線程數(shù)越多下載的速度也就越快,因為線程越多對于程序處理這些線程也是一種負(fù)擔(dān),過多的話反而會降低下載的速度,所以要合理運用。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • OkHttp3中默認(rèn)不保持Cookie的解決方法

    OkHttp3中默認(rèn)不保持Cookie的解決方法

    這篇文章主要給大家介紹了關(guān)于OkHttp3中默認(rèn)不保持Cookie的解決方法,文中先對OKhttp3中的cookies進(jìn)行了簡單的介紹,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例

    Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例

    下面小編就為大家分享一篇Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 詳解android.mk中引用第三方庫的方法

    詳解android.mk中引用第三方庫的方法

    本篇文章主要介紹了詳解android.mk中引用第三方庫的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android8.1原生系統(tǒng)網(wǎng)絡(luò)感嘆號消除的方法

    Android8.1原生系統(tǒng)網(wǎng)絡(luò)感嘆號消除的方法

    這篇文章主要介紹了Android8.1原生系統(tǒng)網(wǎng)絡(luò)感嘆號消除的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Android6.0動態(tài)申請權(quán)限所遇到的問題小結(jié)

    Android6.0動態(tài)申請權(quán)限所遇到的問題小結(jié)

    這篇文章給大家介紹了Android6.0動態(tài)申請權(quán)限所遇到的問題,在沒給大家介紹這下問題之前,先給大家說下基本定義和基本使用方式,本文給大家介紹的非常詳細(xì),具有參考借鑒價值,對android 6.0 動態(tài)權(quán)限遇到問題感興趣的朋友一起看看吧
    2016-11-11
  • 詳解Flutter混排瀑布流解決方案

    詳解Flutter混排瀑布流解決方案

    這篇文章主要介紹了Flutter混排瀑布流解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Android控件CardView實現(xiàn)卡片布局

    Android控件CardView實現(xiàn)卡片布局

    這篇文章主要為大家詳細(xì)介紹了Android控件CardView實現(xiàn)卡片布局,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android中使用PagerSlidingTabStrip實現(xiàn)導(dǎo)航標(biāo)題的示例

    Android中使用PagerSlidingTabStrip實現(xiàn)導(dǎo)航標(biāo)題的示例

    本篇文章主要介紹了Android中使用PagerSlidingTabStrip實現(xiàn)導(dǎo)航標(biāo)題的示例,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Flutter開發(fā)Mac桌面應(yīng)用實現(xiàn)自動提取生成視頻字幕文件

    Flutter開發(fā)Mac桌面應(yīng)用實現(xiàn)自動提取生成視頻字幕文件

    這篇文章主要為大家介紹了Flutter開發(fā)Mac桌面應(yīng)用實現(xiàn)自動提取生成視頻字幕文件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解

    flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解

    這篇文章主要為大家介紹了flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評論

恩平市| 徐闻县| 满城县| 恩平市| 侯马市| 龙海市| 正阳县| 喀什市| 上饶市| 义马市| 溆浦县| 佛山市| 丹江口市| 公主岭市| 宝丰县| 宁陵县| 南开区| 曲靖市| 新源县| 虞城县| 裕民县| 广东省| 北宁市| 盘锦市| 高雄市| 渑池县| 通州区| 佛教| 甘南县| 叶城县| 河津市| 黄石市| 驻马店市| 石泉县| 化隆| 天台县| 图木舒克市| 东光县| 邢台县| 鹤庆县| 柯坪县|