首页 > 代码库 > Android实现多线程断点下载
Android实现多线程断点下载
本案例在于实现文件的多线程断点下载,即文件在下载一部分中断后,可继续接着已有进度下载,并通过进度条显示进度。也就是说在文件开始下载的同时,自动创建每个线程的下载进度的本地文件,下载中断后,重新进入应用点击下载,程序检查有没有本地文件的存在,若存在,获取本地文件中的下载进度,继续进行下载,当下载完成后,自动删除本地文件。
1. 定义布局文件需要用到的属性名及内容
2. 设置用户的Internet权限和关于SD卡的权限
<span style="font-size:14px;"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.INTERNET"/></span>
3. 开始界面的布局
基本效果图如下:
用到两个TextView控件,一个EditText控件,一个Button控件,一个ProgressBar控件
需要注意的是:进度条用<ProgressBar />控件,设置sytle属性:style="?android:attr/progressBarStyleHorizontal"
4.MainActivity的主要程序如下,代码中有注释详解:
package www.csdn.net.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import www.csdn.net.utils.StreamTools; import android.R.integer; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class DownloadActivity extends Activity { // 线程开启的数量 private int threadNum = 3; private int threadRunning = 3; private EditText et_url; private ProgressBar progressBar; private TextView tv_pb; private int currentProgress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); // 获取控件对象 et_url = (EditText) findViewById(R.id.et_url); progressBar = (ProgressBar) findViewById(R.id.pb_down); tv_pb = (TextView) findViewById(R.id.tv_pb); File sdDir = Environment.getExternalStorageDirectory(); File pbFile = new File(sdDir,"pb.txt"); InputStream is = null; try { //判断文件是否存在 if (pbFile.exists()) { is = new FileInputStream(pbFile); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (is != null) { String value = http://www.mamicode.com/StreamTools.streamToStr(is);>对于流的输出可以封装一个StreamTools方法,在主程序中可以应用,代码如下:
package www.csdn.net.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class StreamTools { public static String streamToStr(InputStream is){ String value = http://www.mamicode.com/null;>5. 程序运行结果如图:
sd卡中出现的临时文件,当下载完成会自动删除:
6. 出现的bug原因可能有:
Internet权限没加,服务器没启动,访问下载路径有错,没有获取控件对象等。
如果文件下载中,进度条显示的进度是负数,可能原因是文件大小进行百分比计算时超出内存空间,解决办法:在定义百分比的时候,在100后面加上l,表示long型,即String percent = currentProgress*100l/progressBar.getMax()+"%"。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。