package com.example.kirito.myapplication.testdownload;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* Created by kirito on 2016.10.25.
*/
public class DownLoadHelp {
//创建线程池
private Executor threadPool = Executors.newFixedThreadPool(3);
private Handler handler;
public DownLoadHelp(Handler handler) {
this.handler = handler;
}
static class downRunnable implements Runnable{
private String url;
private String filename;
private long start;
private long end;
private Handler handler;
public downRunnable(String url, String filename, long start, long end,Handler handler) {
this.url = url;
this.filename = filename;
this.start = start;
this.end = end;
this.handler = handler;
}
@Override
public void run() {
HttpURLConnection con = null;
try {
URL urls = new URL(url);
con = (HttpURLConnection) urls.openConnection();
con.setRequestMethod("GET");
con.setReadTimeout(5000);
con.setRequestProperty("Range","bytes="+start+"-" + end);
RandomAccessFile accessFile = new RandomAccessFile(new File(filename),"rwd");
accessFile.seek(start);
InputStream is = con.getInputStream();
byte bt[] = new byte[4 * 1024];
int len = 0;
while ((len = is.read(bt)) != -1){
accessFile.write(bt,0,len);
}
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
if (accessFile != null){
accessFile.close();
}
if (is != null){
is.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (con != null){
con.disconnect();
}
}
}
}
public void downLoadFile(String purl){
HttpURLConnection con = null;
try {
URL url = new URL(purl);
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setReadTimeout(5000);
long length = con.getContentLength();
long block = length / 3;
String fileName = getFileName(purl);
File parent = Environment.getExternalStorageDirectory();
File downLoadFile = new File(parent,fileName);
/**
* 若length = 35,35/3=11
* i = 0,0-10
* i = 1,11-21
* i = 2,22-35(因为有for循环里的if语句)
*/
for (int i = 0; i < 3; i++) {
long start = i * block;
long end = (i + 1) * block - 1;
if (i == 2){
end = length;
}
downRunnable runnable = new downRunnable(purl,downLoadFile.getAbsolutePath(),start,end,handler);
threadPool.execute(runnable);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (con != null){
con.disconnect();
}
}
}
//获取URL里图片的名字
private String getFileName(String url){
return url.substring(url.lastIndexOf('/') + 1);
}
}
测试界面
package com.example.kirito.myapplication.testdownload;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.kirito.myapplication.R;
/**
* Created by kirito on 2016.10.25.
*/
public class TestDownLoad extends AppCompatActivity {
private Button btn;
private TextView tv;
private int count;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
count += msg.what;
if (count == 3){
tv.setText("download success!");
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testgosn);
btn = (Button) findViewById(R.id.td_btn);
tv = (TextView) findViewById(R.id.td_tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
DownLoadHelp downLoadHelp = new DownLoadHelp(handler);
downLoadHelp.downLoadFile("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2980880098,337923771&fm=116&gp=0.jpg");
}
}).start();
}
});
}
}