您的位置:首页 > 移动开发 > Android开发

Android多线程断点下载文件

2015-01-31 03:50 357 查看
1:AndroidManifest.xml中添加权限   <uses-permission android:name="android.permission.INTERNET" />       <!-- 在SDCard中创建与删除文件权限 -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2:UI界面
3:代码  
    private Button stop;private EditText getURL;private Button run;private ProgressBar bar;// 获得sd卡路径
private final String root = Environment.getExternalStorageDirectory()
.getAbsolutePath() + File.separator;private Handler handler = new Handler() {@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if (msg.what == 110) {
bar.setProgress(msg.arg1);
}
super.handleMessage(msg);
}};@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);run = (Button) this.findViewById(R.id.button1);stop = (Button) this.findViewById(R.id.button2);getURL = ((EditText) this.findViewById(R.id.edit_url));bar = (ProgressBar) this.findViewById(R.id.progressBar1);run.setOnClickListener(new OnClickListener() {@Override
public void onClick(View v) {
// TODO Auto-generated method stubnew Thread() {private byte[] bys = new byte[4 * 1024];private int len = -1;// 已读取
private int readsize = 0;// 总大小
private int countsize = 0;private Message msg = null;@Override
public void run() {
isno = true;
String geturl = getURL.getText().toString();
String fileName = root
+ geturl.substring(geturl.lastIndexOf("/") + 1,
geturl.length());
System.out.println(fileName);
FileOutputStream os = null;
InputStream input = null;
try {
File file = new File(fileName);
if (!file.exists())
file.createNewFile();
readsize = (int) file.length();
URL url = new URL(geturl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
countsize = conn.getContentLength();// 获得文件总大小
input = conn.getInputStream();
os = new FileOutputStream(fileName, true);
System.out.println("countsize:" + countsize);
System.out.println("readsize:" + readsize);
if (countsize > readsize) {
if (readsize != 0)
input.skip(readsize);
while ((len = input.read(bys)) != -1) {
if (isCancelled()) {
os.write(bys);
readsize += len;
System.out.println(readsize * 100
/ countsize + "%");
msg = new Message();
msg.what = 110;
msg.arg1 = readsize * 100 / countsize;
handler.sendMessage(msg);
} else
break;
}
if (len == -1) {
msg = new Message();
msg.what = 110;
msg.arg1 = 0;
handler.sendMessage(msg);//清空读取条
}
}
os.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}.start();
}
});//暂停下载
stop.setOnClickListener(new OnClickListener() {@Override
public void onClick(View v) {
// TODO Auto-generated method stub
isno = false;
}
});
}private boolean isno = true;private boolean isCancelled() {
// TODO Auto-generated method stub
return isno;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息