转载

Android多任务多线程下载

标签: android 多线程 下载 | 发表时间:2015-12-13 01:56 | 作者:wuwangwr3

分享到:
出处:http://www.iteye.com

关注微信号:javalearns   随时随地学Java

或扫一扫

Android多任务多线程下载

随时随地学Java

打算实现一个下载功能,当然理想的功能要支持多任务下载、多线程下载、断点续传的功能,我想一步一步来,首先困难摆在了多任务这里。

开始的思路是在一个Service中启动下载的流操作,然后通过Service中声明一个Activity中的Handler更新UI(比如进度条。。。)

可是我发现在Service中声明一个Activity中的Handler是做不到的(可能只是我做不到吧,无法申请内存)

于是,我决定在Activity中直接启动线程,让其运行,调用自身的Handler来更新UI,没想到在这个下载Activity onPause()的时候,线程还是活的,也就是说可以继续下载,下例是我做的一个两个任务同时下载的小例子,后面会把理想中的功能都陆续添加上的。

main.xml配置:

AndroidManifest.xml配置:

Activity程序:

package sms.down;  import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.widget.ProgressBar; import android.widget.TextView;  public class MulThreadDownload extends Activity {  /** Called when the activity is first created. */  private ProgressBar pb1 = null;  private TextView tv1 = null;  private ProgressBar pb2 = null;  private TextView tv2 = null;   private String root = Environment.getExternalStorageDirectory()    .getAbsolutePath() + File.separator;  private String downloadFile = "http://www.android-study.com/resource/qzh.mp3";  private String downloadFile1 = "http://www.android-study.com/resource/wk.mp3";   // 声明已经读过的长度变量  private int hasRead = 0;   public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.main);    pb1 = (ProgressBar) findViewById(R.id.progressBar1);   tv1 = (TextView) findViewById(R.id.textView1);    pb2 = (ProgressBar) findViewById(R.id.progressBar2);   tv2 = (TextView) findViewById(R.id.textView2);    download(downloadFile, root, pb1, tv1);    download(downloadFile1, root, pb2, tv2);  }   private void download(String url, String targetPath, ProgressBar pb,    TextView tv) {   DownloadThread dt = new DownloadThread(url, targetPath, pb, tv);    dt.start();  }   // 自定义一个Handler类,处理线程消息  public class MyHandler extends Handler {   private ProgressBar progressBar;   private TextView textView;    // 通过构造函数来确定给哪个ProgressBar刷新   public MyHandler(ProgressBar progressBar, TextView textView) {    this.progressBar = progressBar;    this.textView = textView;   }    public void handleMessage(Message msg) {    this.progressBar.setProgress(msg.arg1);    this.textView.setText(msg.arg1 + "%");     super.handleMessage(msg);   }  }   // 下载线程  public class DownloadThread extends Thread {   private String url = "";   private String targetPath = "";    private int hasDownload = 0;    private int len = -1;   private byte buffer[] = new byte[4 * 1024];   private int size = 0;   private int rate = 0;    private MyHandler myHandler = null;   private Message msg = null;    private ProgressBar pb = null;   private TextView tv = null;    public DownloadThread(String url, String targetPath, ProgressBar pb,     TextView tv) {    this.url = url;    this.targetPath = targetPath;     this.pb = pb;    this.tv = tv;     myHandler = new MyHandler(this.pb, this.tv);   }    public void run() {    String targetFileName = this.targetPath      + this.url.substring(this.url.lastIndexOf("/") + 1,        this.url.length());    File downloadFile = new File(targetFileName);     if (!downloadFile.exists()) {     try {      downloadFile.createNewFile();     } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();     }    }     try {     URL fileUrl = new URL(this.url);     HttpURLConnection conn = (HttpURLConnection) fileUrl       .openConnection();      // 获取文件大小     size = conn.getContentLength();      InputStream is = conn.getInputStream();      OutputStream os = new FileOutputStream(targetFileName);      while ((len = is.read(buffer)) != -1) {      os.write(buffer);       hasDownload += len;       rate = (hasDownload * 100 / size);       msg = new Message();       msg.arg1 = rate;       myHandler.sendMessage(msg);       System.out.println(rate + "%");     }    } catch (MalformedURLException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (IOException e) {     e.printStackTrace();    }    }  }  }

程序运行效果:

Android多任务多线程下载

下一篇将实现断点续传和暂停删除开始事件。

关注微信号:javalearns   随时随地学Java

或扫一扫

Android多任务多线程下载

随时随地学Java

已有 0 人发表留言,猛击->> 这里 <<-参与讨论

ITeye推荐

  • —软件人才免语言低担保 赴美带薪读研!—
正文到此结束
Loading...