package com.zhan_dui.dictionary.runnables;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import com.zhan_dui.dictionary.utils.Constants;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
/**
* 实现下载的Runnable接口
*
* @author xuanqinanhai
*
*/
public class DownloadRunnable implements Runnable {
private Handler handlers[];
private String targetUrl;
private String saveName;
private String cnName;
/**
* 如果想要得到每次的下载更新,则声明该接口
*
* @author xuanqinanhai
*
*/
public interface DownloadGetEveryUpdateInterface {
}
static {
if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment
.getExternalStorageState())) {
File file = new File(Environment.getExternalStorageDirectory()
+ "/" + Constants.SAVE_DIRECTORY);
if (!file.exists())
file.mkdir();
}
}
/**
*
* @param handlers
* 下载处理线程
* @param targetUrl
* 要下载的文件url
* @param saveName
* 要保存的文件名
*/
public DownloadRunnable(Handler handlers[], String targetUrl,
String saveName, String cnName, boolean hidden, String prefix) {
this.handlers = handlers;
this.cnName = cnName;
this.targetUrl = targetUrl;
this.saveName = saveName;
if (prefix != null) {
this.saveName = prefix + this.saveName;
}
if (hidden == true) {
this.saveName = "." + this.saveName;
}
}
public static class DownloadInformation {
public String downloadFileName;
public String downloadSaveName;
public String downloadUrl;
public String downloadFlag;
public long downloadCurrentSize;
public long downloadId;
}
private boolean stopflag = false;
public void stop() {
stopflag = true;
}
@Override
public void run() {
Message msg = null;
File file;
if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment
.getExternalStorageState())) {
file = new File(Environment.getExternalStorageDirectory() + "/"
+ Constants.SAVE_DIRECTORY, saveName);
if (file.exists() == false) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
for (Handler handler : handlers) {
msg = Message.obtain(handler,
Constants.FILE_CREATE_ERROR);
msg.obj = cnName;
msg.sendToTarget();
}
return;
}
}
DownloadInformation downloadInformation = new DownloadInformation();
downloadInformation.downloadFileName = cnName;
downloadInformation.downloadSaveName = saveName;
downloadInformation.downloadUrl = targetUrl;
try {
URL url = new URL(targetUrl);
URLConnection connection = url.openConnection();
connection.setReadTimeout(30000);
connection.setConnectTimeout(30000);
InputStream inputStream = connection.getInputStream();
OutputStream outputStream = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
outputStream);
byte buffer[] = new byte[1024];
int length;
int downloaded = 0;
int counter = 0;
while ((length = inputStream.read(buffer)) > 0
&& stopflag == false) {
bufferedOutputStream.write(buffer, 0, length);
downloaded += length;
if (counter++ % 1024 == 0) {
for (Handler handler : handlers) {
if (handler instanceof DownloadGetEveryUpdateInterface) {
msg = Message.obtain(handler,
Constants.DOWNLOADING,
downloaded / 1024, 0);
msg.obj = downloadInformation;
msg.sendToTarget();
}
}
}
}
bufferedOutputStream.flush();
bufferedOutputStream.close();
inputStream.close();
if (stopflag == true) {
for (Handler handler : handlers) {
msg = Message
.obtain(handler, Constants.DOWNLOAD_CANCEL);
msg.obj = downloadInformation;
msg.sendToTarget();
}
} else {
for (Handler handler : handlers) {
msg = Message.obtain(handler,
Constants.DOWNLOAD_SUCCESS);
msg.obj = downloadInformation;
msg.sendToTarget();
}
}
} catch (Exception e) {
e.printStackTrace();
for (Handler handler : handlers) {
msg = Message.obtain(handler, Constants.CONNECTION_ERROR);
msg.obj = downloadInformation;
msg.sendToTarget();
}
}
}
}
}