多线程下载
2017-11-23 11:15
127 查看
第一步:加权限
第二步:
第三步:
第四步:
第五步:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
第二步:
public class DownLoadUtils { public static void setNet(String baseUrl, String path,int blockSize,int startPosition){ RandomAccessFile raf=null; BufferedInputStream bis=null; try { File f=new File(path); if(!f.exists()){ f.createNewFile(); } URL url=new URL(baseUrl); HttpURLConnection con=(HttpURLConnection) url.openConnection(); con.setReadTimeout(5000); con.setConnectTimeout(5000); if(blockSize>0){ long end=blockSize+startPosition-1; con.setRequestProperty("Range","bytes="+startPosition+"-"+end); Log.i("--------------", "setNet: "+startPosition+"-"+end); } int code = con.getResponseCode(); if(code<400){ bis = new BufferedInputStream(con.getInputStream()); raf=new RandomAccessFile(f,"rwd"); raf.seek(startPosition); int len=0; byte[] buff=new byte[1024*8]; while ((len=bis.read(buff))!=-1){ raf.write(buff,0,len); if(DialogUtils.PROGRESS<0){ DialogUtils.PROGRESS=0; } 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 baseUrl){ int length=0; try { URL url=new URL(baseUrl); HttpURLConnection con=(HttpURLConnection) url.openConnection(); con.setReadTimeout(5000); length=con.getContentLength(); } catch (Exception e) { e.printStackTrace(); } return length; } }
第三步:
public class DownTask extends Thread { String downloadUrl; String path; int blockSize; int startPosition; public DownTask(String downloadUrl, String path, int blockSize, int startPosition) { this.downloadUrl = downloadUrl; this.path = path; this.blockSize = blockSize; this.startPosition = startPosition; } @Override public void run() { DownLoadUtils.setNet(downloadUrl,path,blockSize,startPosition); } }
第四步:
public class DownThread extends Thread { private String baseurl=""; private String path; private int threadNum=5; int start; int end; public DownThread(String baseurl, String path) { this.baseurl = baseurl; this.path = path; } @Override public void run() { int len=DownLoadUtils.getFileLength(baseurl); Log.i("----len--------", "run: len"+len); DialogUtils.MAX=len; int blockSize=len/threadNum; for (int i = 0; i<threadNum ; i++) { int startPosition=blockSize*i; if(i==threadNum-1){ blockSize=len-blockSize*(threadNum-1); } new DownTask(baseurl,path,blockSize,startPosition).start(); } } }
第五步:
public class DialogUtils{ public static long MAX =0 ; public static long PROGRESS = -2; public void getDialog(final Context context){ AlertDialog.Builder builder=new AlertDialog.Builder(context); builder.setTitle("发现新版本"); builder.setIcon(R.mipmap.ic_launcher); builder.setMessage("最新版本:V1.0.1.1686"); builder.setMessage("新版本大小:11.79MB"); builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new DownThread("http://169.254.51.153:8080/com.taobao.taobao_161.apk", context.getCacheDir()+"/com.taobao.taobao_161.apk").start(); showProgress(context); } }); builder.setNegativeButton("以后在说",null); builder.show(); } public 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... params) { while (PROGRESS+1<MAX){ // SystemClock.sleep(10); if(MAX>0){ publishProgress((int)(PROGRESS * 100 / MAX)); } }; return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); pd.dismiss(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // Log.i("--onProgressUpdate---", "onProgressUpdate: "+values[0]); pd.setProgress(values[0]); } }.execute(); } }最后一步:
public class MainActivity extends AppCompatActivity { //sd卡:String localPath = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/local"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DialogUtils dialogUtils=new DialogUtils(); dialogUtils.getDialog(this); } }
相关文章推荐
- 让APACHE防止多线程下载
- 编写该多线程下载程序遇到的问题
- 网络编程——断点续传和多线程下载模式(转)
- 使用java实现http多线程下载
- 多线程下载实现函数
- 多线程下载,拷贝文件java代码
- wp7之《够酷悦音播放器》 使用线程池实现多线程下载
- Python实现多线程下载
- 利用IdHTTP进行多线程下载
- Android学习笔记---java实现多线程下载器,30_多线程下载原理介绍和使用
- Android开发(24)---安卓中实现多线程下载(带进度条和百分比)
- android 多线程下载 支持断点续传的工具类
- JavaWeb---实现多线程下载
- 多线程下载
- 多线程下载
- android多线程下载的实现
- android下多线程下载,断点续传,及暂停按钮
- android多线程下载
- python基于queue和threading实现多线程下载实例
- Android多线程下载大文件解析