欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實現(xiàn)多線程斷點下載的方法

 更新時間:2015年05月29日 15:45:26   作者:dacainiao007  
這篇文章主要介紹了Android實現(xiàn)多線程斷點下載的方法,可實現(xiàn)開始、暫停下載及百分比進度條等功能,非常具有實用價值,需要的朋友可以參考下

本文實例講述了Android實現(xiàn)多線程斷點下載的方法。分享給大家供大家參考。具體實現(xiàn)方法如下:

package cn.itcast.download; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.RandomAccessFile; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 
import cn.itcast.mutiledownload.StreamTool; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 
public class MutiledownloadActivity extends Activity implements OnClickListener { 
  private ProgressBar pb; 
  private Button bt; 
  private TextView tv; 
  private EditText et; 
  boolean flag = true; 
  boolean stopflag = false; 
  private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
      pb.setProgress(total); 
      int max = pb.getMax(); 
      if (total >= (max - 1)) { 
        total = max; 
        flag = false; 
      } 
      int result = total * 100 / max; 
      tv.setText("當前進度 :" + result + "%"); 
      super.handleMessage(msg); 
    } 
  }; 
  int total = 0; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    pb = (ProgressBar) this.findViewById(R.id.pb); 
    bt = (Button) this.findViewById(R.id.bt); 
    tv = (TextView) this.findViewById(R.id.tv_process); 
    et = (EditText) this.findViewById(R.id.et); 
    bt.setOnClickListener(this); 
  } 
  @Override 
  public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.bt: 
      // 創(chuàng)建一個子線程 定期的更新ui 
      if("開始下載".equals(bt.getText().toString())){ 
        bt.setText("暫停"); 
        stopflag = false; //開始下載  
      } 
      else { 
        bt.setText("開始下載"); 
        stopflag = true; 
      } 
        new Thread() { 
          @Override 
          public void run() { 
            super.run(); 
            while (flag) { 
              try { 
                sleep(1000); 
                // 如果total > = 文件長度 
                Message msg = new Message(); 
                handler.sendMessage(msg); 
              } catch (InterruptedException e) { 
                e.printStackTrace(); 
              } 
            } 
          } 
        }.start(); 
 
        // 開始執(zhí)行下載的操作 
        String path = et.getText().toString().trim(); 
        if ("".equals(path)) { 
          Toast.makeText(this, "路徑不能為空", 1).show(); 
          return; 
        } 
        try { 
          URL url = new URL(path); 
          HttpURLConnection conn = (HttpURLConnection) url 
              .openConnection(); 
          conn.setRequestMethod("GET"); 
          conn.setConnectTimeout(5000); 
          conn.setRequestProperty("User-Agent", 
              "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); 
          int code = conn.getResponseCode(); 
          if (code == 200) { 
            int len = conn.getContentLength(); 
            RandomAccessFile file = new RandomAccessFile( 
                "/mnt/sdcard/" + getFilenName(path), "rwd"); 
            // 1.設置本地文件大小跟服務器的文件大小一致 
            file.setLength(len); 
            // 設置進度條的最大值 
            pb.setMax(len); 
            // 2 .假設開啟3 個線程 
            int threadnumber = 3; 
            int blocksize = len / threadnumber; 
            /** 
             * 線程1 0~ blocksize 線程2 1*bolocksize ~ 2*blocksize 線程3 
             * 2*blocksize ~ 文件末尾 
             */ 
            for (int i = 0; i < threadnumber; i++) { 
              int startposition = i * blocksize; 
              int endpositon = (i + 1) * blocksize; 
              if (i == (threadnumber - 1)) { 
                // 最后一個線程 
                endpositon = len; 
              } 
              DownLoadTask task = new DownLoadTask(i, path, 
                  startposition, endpositon); 
              task.start(); 
            } 
          } 
        } catch (Exception e) { 
          Toast.makeText(this, "下載出現(xiàn)異常", 0).show(); 
          e.printStackTrace(); 
        } 
      break; 
    } 
  } 
  class DownLoadTask extends Thread { 
    int threadid; 
    String filepath; 
    int startposition; 
    int endpositon; 
    public DownLoadTask(int threadid, String filepath, int startposition, 
        int endpositon) { 
      this.threadid = threadid; 
      this.filepath = filepath; 
      this.startposition = startposition; 
      this.endpositon = endpositon; 
    } 
    @Override 
    public void run() { 
      try { 
        File postionfile = new File("/mnt/sdcard/" + threadid + ".txt"); 
        URL url = new URL(filepath); 
        HttpURLConnection conn = (HttpURLConnection) url 
            .openConnection(); 
        System.out.println("線程" + threadid + "正在下載 " + "開始位置 : " 
            + startposition + "結束位置 " + endpositon); 
        if (postionfile.exists()) { 
          FileInputStream fis = new FileInputStream(postionfile); 
          byte[] result = StreamTool.getBytes(fis); 
          String str = new String(result); 
          if (!"".equals(str)) { 
            int newstartposition = Integer.parseInt(str); 
            if (newstartposition > startposition) { 
              startposition = newstartposition; 
            } 
          } 
        } 
        // "Range", "bytes=2097152-4194303") 
        conn.setRequestProperty("Range", "bytes=" + startposition + "-" 
            + endpositon); 
        conn.setRequestMethod("GET"); 
        conn.setConnectTimeout(5000); 
        conn.setRequestProperty("User-Agent", 
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); 
        InputStream is = conn.getInputStream(); 
        RandomAccessFile file = new RandomAccessFile("/mnt/sdcard/" 
            + getFilenName(filepath), "rwd"); 
        // 設置 數(shù)據從文件哪個位置開始寫 
        file.seek(startposition); 
        byte[] buffer = new byte[1024]; 
        int len = 0; 
        // 代表當前讀到的服務器數(shù)據的位置 ,同時這個值已經存儲的文件的位置 
        int currentPostion = startposition; 
        // 創(chuàng)建一個文件對象 ,記錄當前某個文件的下載位置 
        while ((len = is.read(buffer)) != -1) { 
          if (stopflag) { 
            return; 
          } 
          file.write(buffer, 0, len); 
          synchronized (MutiledownloadActivity.this) { 
            total += len; 
          } 
          currentPostion += len; 
          // 需要把currentPostion 信息給持久化到存儲設備 
          String position = currentPostion + ""; 
          FileOutputStream fos = new FileOutputStream(postionfile); 
          fos.write(position.getBytes()); 
          fos.flush(); 
          fos.close(); 
        } 
        file.close(); 
        System.out.println("線程" + threadid + "下載完畢"); 
        // 當線程下載完畢后 把文件刪除掉 
        if (postionfile.exists()) { 
          postionfile.delete(); 
        } 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
      super.run(); 
    } 
  } 
  public String getFilenName(String path) { 
    int start = path.lastIndexOf("/") + 1; 
    return path.substring(start, path.length()); 
  } 
}

希望本文所述對大家的Android程序設計有所幫助。

相關文章

  • listview的上滑下滑監(jiān)聽,上下滑監(jiān)聽隱藏頂部選項欄的實例

    listview的上滑下滑監(jiān)聽,上下滑監(jiān)聽隱藏頂部選項欄的實例

    下面小編就為大家分享一篇listview的上滑下滑監(jiān)聽,上下滑監(jiān)聽隱藏頂部選項欄的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • android實現(xiàn)數(shù)獨游戲機器人

    android實現(xiàn)數(shù)獨游戲機器人

    這篇文章主要為大家詳細介紹了android實現(xiàn)數(shù)獨游戲機器人,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android ImageView 固定寬高比例的實現(xiàn)方法

    Android ImageView 固定寬高比例的實現(xiàn)方法

    這篇文章主要介紹了Android ImageView 固定寬高比例的實現(xiàn)方法的相關資料,,方法一:設置 adjustViewBounds="true",方法二:使用 Universal-Image-Loader 圖片緩存類,需要注意的是方法二和方法一同時使用導致設置無效,需要的朋友可以參考下
    2017-07-07
  • Flutter實現(xiàn)紅包動畫效果的示例代碼

    Flutter實現(xiàn)紅包動畫效果的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Flutter實現(xiàn)紅包的動畫效果,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Android利用軟引用和弱引用避免OOM的方法

    Android利用軟引用和弱引用避免OOM的方法

    Java從JDK1.2版本開始,就把對象的引用分為四種級別,從而使程序能更加靈活的控制對象的生命周期。這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。本文給大家介紹Android利用軟引用和弱引用避免OOM,需要的朋友一起學習吧
    2016-04-04
  • Android App中實現(xiàn)簡單的刮刮卡抽獎效果的實例詳解

    Android App中實現(xiàn)簡單的刮刮卡抽獎效果的實例詳解

    這篇文章主要介紹了Android App中實現(xiàn)簡單的刮刮卡抽獎效果的實例詳解,文中主要借助Bitmap的canvas.drawPath的api來實現(xiàn),需要的朋友可以參考下
    2016-03-03
  • android使用service和activity獲取屏幕尺寸的方法

    android使用service和activity獲取屏幕尺寸的方法

    這篇文章主要介紹了android使用service和activity獲取屏幕尺寸的方法,實例分析了基于service和activity兩種方法獲取屏幕尺寸的相關技巧,非常簡單實用,需要的朋友可以參考下
    2015-08-08
  • Android入門之利用Spinner實現(xiàn)彈出選擇對話框

    Android入門之利用Spinner實現(xiàn)彈出選擇對話框

    這篇文章主要為大家詳細介紹了Android里如何巧用Spinner做彈出選擇對話框,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2022-11-11
  • Android手機衛(wèi)士之確認密碼對話框

    Android手機衛(wèi)士之確認密碼對話框

    這篇文章主要為大家詳細介紹了Android手機衛(wèi)士之確認密碼對話框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Kotlin注解實現(xiàn)Parcelable序列化流程詳解

    Kotlin注解實現(xiàn)Parcelable序列化流程詳解

    有時我們會在界面跳轉的過程中,做對象傳值,這時就需要對該對象做序列化處理了。Android中對對象的序列化處理有兩種方式,這篇文章主要介紹了Kotlin注解實現(xiàn)Parcelable序列化
    2022-12-12

最新評論