多线程下载
来源:互联网 发布:云计算教学视频百度云 编辑:程序博客网 时间:2024/06/09 12:14
//创建一个线程类
public class DownLoadTask extends Thread {
String downLoadUrl;
String path;
int blockSize;
long startPosition;
public DownLoadTask(String downLoadUrl, String path, int blockSize, long startPosition) {
this.downLoadUrl = downLoadUrl;
this.path = path;
this.blockSize = blockSize;
this.startPosition = startPosition;
}
@Override
public void run() {
NetUtils.downLoadFile(downLoadUrl,path,blockSize,startPosition);
}
}
//创建另一个线程类
public class DownLoadThread extends Thread {
private String downLoadUrl="";
private String path;
private int threadNum=5;
public DownLoadThread(String downLoadUrl, String path, int threadNum) {
this.downLoadUrl = downLoadUrl;
this.path = path;
this.threadNum = threadNum;
}
@Override
public void run() {
int len=NetUtils.getFileLength(downLoadUrl);
DialogUtils.MAX_SIZE=len;
int blockSize=len/threadNum;
// int blockSize= (int) Math.round(tempSize+0.5);
for (int i = 0; i < threadNum; i++) {
int startPosition = i * blockSize;
if (i==threadNum-1){
blockSize=len-blockSize*(threadNum-1);
}
// new DownLoadTask(downLoadUrl,path,blockSize,i).start();
new DownLoadTask(downLoadUrl,path,blockSize,startPosition).start();
}
}
}
//创建一个工具类
public class NetUtils {
public static void downLoadFile(String downloadUrl,String path,int blockSize,long startPosition) {
BufferedInputStream bis=null;
RandomAccessFile raf=null;
try {
File file=new File(path);
if (!file.exists()){
file.createNewFile();
}
URL url=new URL(downloadUrl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
if (blockSize>0){
long end=blockSize + startPosition - 1;
conn.setRequestProperty("Range","bytes="+startPosition+"-"+end);
Log.i(Thread.currentThread()+"===========", "bytes="+startPosition+"-"+end);
}
int code=conn.getResponseCode();
if (code<400){
bis=new BufferedInputStream(conn.getInputStream());
raf=new RandomAccessFile(file,"rwd");
raf.seek(startPosition);
int len=0;
byte[] buff=new byte[1024*8];
while ((len=bis.read(buff))!=-1){
synchronized (NetUtils.class){
raf.write(buff,0,len);
DialogUtils.PROGRESS+=len;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis!=null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (raf!=null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static int getFileLength(String downLoadUrl){
int len=0;
try {
URL url=new URL(downLoadUrl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
len=conn.getContentLength();
} catch (Exception e) {
e.printStackTrace();
}
return len;
}
}
//创建另一个工具类
public class DialogUtils {
public static int MAX_SIZE=0;
public static int PROGRESS=0;
public static void showUpdataDialog(final Context context){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("是否更新")
.setMessage("太久了,更新吧")
.setNegativeButton("No",null)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
new DownLoadThread("http://169.254.32.59:8080/c.png",context.getCacheDir()+"/c.png",5).start();
showProgress(context);
}
}).show();
}
public static void showProgress(final Context context){
final ProgressDialog pd=new ProgressDialog(context);
pd.setTitle("正在更新");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(100);
pd.show();
new AsyncTask<String,Integer,String>(){
@Override
protected String doInBackground(String... strings) {
while (PROGRESS<MAX_SIZE){
SystemClock.sleep(100);
publishProgress((int)(PROGRESS*100/MAX_SIZE));
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
pd.dismiss();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pd.setProgress(values[0]);
}
}.execute();
}
}
//主Activity里调用方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DialogUtils.showUpdataDialog(this);
}
}
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- 多线程下载
- Python字符串和随机
- 5.7大小写英文字母转换
- angularjs添加和搜索
- reyclerView
- RecyclerView的上拉加载下拉刷新-xRecyclerView
- 多线程下载
- java创建树及实现遍历
- ubuntu系统的定制裁剪(适用于嵌入式瘦客户端)
- Android横竖屏切换咱得知道的一些东西
- 机房错误解决与知识总结-1
- lesson7
- 一、Android安全机制之前言
- Struts2 HelloWorld实现
- java语言程序设计 第十三章 抽象类与接口 (13.2、13.3、13.4)