android多线程暂停下载-HttpURLConnection

版权声明:本文为Mr.release原创文章,转载请标明出处

android多线程暂停下载-HttpURLConnection

private EditText et_path;
	private LinearLayout ll_pbs;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et_path = (EditText) findViewById(R.id.et_path);
		ll_pbs = (LinearLayout) findViewById(R.id.ll_pbs);
	}

	public void startDownload(View view){
		
		//资源路径
		final String path = et_path.getText().toString().trim();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				URL url;
				try {
					url = new URL(path);
					HttpURLConnection conn = (HttpURLConnection) url.openConnection();
					conn.connect();
					
					int totalSize = conn.getContentLength();
					int threadCount = 3;
					
					//计算每个线程下载的字节数
					int blockSize = totalSize/3;
					
					//目标路径
					String target = Environment.getExternalStorageDirectory().getAbsolutePath()+"/bbb.jpg";
					
					for (int i = 1; i <= threadCount; i++) {
						
						int id = i;
						int startIndex = (id-1)*blockSize;
						int endIndex = -1;
						
						if (id==threadCount) {
							//3*3-1
							endIndex = totalSize-1;
						}else {
							endIndex = id*blockSize-1;
						}
						
						final ProgressBar pb = (ProgressBar) View.inflate(MainActivity.this, R.layout.pb, null);
						runOnUiThread(new Runnable() {
							
							@Override
							public void run() {
								ll_pbs.addView(pb);
							}
						});
						
						DownloadThread downloadThread = new DownloadThread(id,startIndex,endIndex,path,target,pb);
						downloadThread.start();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
		}).start();
	}
	
	class DownloadThread extends Thread{
		
		private int id;
		private int startIndex;
		private int endIndex;
		private String path;
		private String target;
		private File tempFile;
		private ProgressBar pb;
		private int newStartIndex;
		public DownloadThread(int id, int startIndex, int endIndex,String path, String target,ProgressBar pb) {
			super();
			this.id = id;
			this.startIndex = startIndex;
			this.endIndex = endIndex;
			this.path = path;
			this.target = target;
			this.pb = pb;
			
			
			tempFile = new File(Environment.getExternalStorageDirectory(),"thread"+id+".tmp");
			try {
				BufferedReader br = new BufferedReader(new FileReader(tempFile));
				String readLine = br.readLine();
				br.close();
				newStartIndex = Integer.parseInt(readLine);
			} catch (Exception e) {
				newStartIndex = startIndex;
			}
			pb.setMax(endIndex-startIndex);
		}
		
		@Override
		public void run() {
			
			try {
				
				URL url = new URL(path);
				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
				conn.setRequestProperty("Range", "bytes="+newStartIndex+"-"+endIndex);
				conn.connect();
				
				int code = conn.getResponseCode();
				if (206==code) {
					InputStream inputStream = conn.getInputStream();
					
					File file = new File(target);
					RandomAccessFile raf = new RandomAccessFile(file ,"rwd");
					raf.seek(newStartIndex);
					
					int len=-1;
					byte[] buffer = new byte[1024];
					int total =0;
					while((len=inputStream.read(buffer))!=-1){
						
						FileWriter fileWriter = new FileWriter(tempFile);
						
						raf.write(buffer,0,len);
						total+=len;
						
						fileWriter.write(""+(newStartIndex+total));
						fileWriter.close();
						//当前线程下载的总百分比
						float process =(100.f* (total+newStartIndex-startIndex))/(endIndex-startIndex);
						System.out.println(id+"下载了"+process);
						pb.setProgress(total+newStartIndex-startIndex);
					}
					System.out.println(id+"已完成");
					raf.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
		
	}

你可能感兴趣的:(android基础)