|
package com.changcheng.download;
import java.io.File;
import com.changcheng.net.download.DownloadProgressListener;
import com.changcheng.net.download.FileDownloader;
import com.changcheng.download.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MulThreadDownloader extends Activity {
private EditText pathText;
private ProgressBar progressBar;
private TextView resultView;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(!Thread.currentThread().isInterrupted()){
switch (msg.what) {
case 1:
// 获取当前文件下载的进度
int size = msg.getData().getInt("size");
progressBar.setProgress(size);
int result = (int)(((float)size/(float)progressBar.getMax()) * 100);
resultView.setText(result+ "%");
if(progressBar.getMax() == size){
Toast.makeText(MulThreadDownloader.this, "文件下载完成", 1).show();
}
break;
case -1:
String error = msg.getData().getString("error");
Toast.makeText(MulThreadDownloader.this, error, 1).show();
break;
}
}
super.handleMessage(msg);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pathText = (EditText)this.findViewById(R.id.path);
progressBar = (ProgressBar)this.findViewById(R.id.downloadbar);
resultView = (TextView)this.findViewById(R.id.resultView);
Button button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String path = pathText.getText().toString();
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//下载文件需要很长的时间,主线程是不能够长时间被阻塞,如果主线程被长时间阻塞, 那么Android被回收应用
download(path, Environment.getExternalStorageDirectory());
}else{
Toast.makeText(MulThreadDownloader.this, R.string.sdcarderror, 1).show();
}
}
});
}
/**
* 下载文件
* @param path 下载路径
* @param saveDir 文件保存目录
*/
//对于Android的UI控件,只能由主线程负责显示界面的更新,其他线程不能直接更新UI控件的显示
public void download(final String path, final File saveDir){
new Thread(new Runnable() {
@Override
public void run() {
FileDownloader downer = new FileDownloader(MulThreadDownloader.this, path, saveDir, 3);
progressBar.setMax(downer.getFileSize());//设置进度条的最大刻度
try {
downer.download(new DownloadProgressListener(){
@Override
public void onDownloadSize(int size) {
Message msg = new Message();
msg.what = 1;
msg.getData().putInt("size", size);
handler.sendMessage(msg);//发送消息
}});
} catch (Exception e) {
Message msg = new Message();
msg.what = -1;
msg.getData().putString("error", "下载失败");
handler.sendMessage(msg);
}
}
}).start();
}
}
|