public class DownLoad extends Thread {
private static final int THREAD_NUMBER = 3;
private URL mImageUrl;
private Executor mExecutor = Executors.newFixedThreadPool(3);
private Handler mHandler;
public DownLoad(URL imageUrl, Handler handler) {
mImageUrl = imageUrl;
mHandler = handler;
}
@Override
public void run() {
try {
HttpURLConnection conn = (HttpURLConnection) mImageUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
long length = conn.getContentLength();
long block = length / THREAD_NUMBER;
for (int i = 0; i < THREAD_NUMBER; i++) {
long start = i * block;
long end = (i + 1) * block - 1;
if (i == THREAD_NUMBER - 1) {
end = length;
}
mExecutor.execute(new DownRunnable(mImageUrl, start, end));
}
} catch (IOException e) {
e.printStackTrace();
}
}
private class DownRunnable extends Thread {
private URL mUrl;
private long mStart;
private long mEnd;
private String mFilePath;
public DownRunnable(URL Url, long start, long end) {
mUrl = Url;
mStart = start;
mEnd = end;
}
@Override
public void run() {
super.run();
HttpURLConnection conn;
try {
conn = (HttpURLConnection) mImageUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.setRequestProperty("Range", "bytes=" + mStart + "-" + mEnd);
InputStream in = conn.getInputStream();
mFilePath = getFilePath(mUrl);
RandomAccessFile access = new RandomAccessFile(new File(mFilePath), "rwd");
access.seek(mStart);
byte[] b = new byte[5 * 1024];
int len;
while ((len = in.read(b)) != -1) {
access.write(b, 0, len);
}
if (access != null) {
access.close();
}
if (in != null) {
in.close();
}
mHandler.post(new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(1);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private String getFilePath(URL url) {
String str = url.toString();
File parent = Environment.getExternalStorageDirectory();
File file = new File(parent, str.substring(str.lastIndexOf('/') + 1));
return file.getAbsolutePath();
}
}
}