当前位置: 代码迷 >> Android >> 转:关于android多任务同时上载的一点心得
  详细解决方案

转:关于android多任务同时上载的一点心得

热度:73   发布时间:2016-05-01 15:26:54.0
转:关于android多任务同时下载的一点心得

学习android快两个月了,一直坚持从迷茫中寻找可以得到的尽可能多的东西

想做一个下载功能,当然理想的功能要支持多任务同时下载,断点续传的功能,我想一步一步来,首先困难摆在了多任务这里

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

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

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

?

package oneRain.MulThreadDownload;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 oneRain.MulThreadDownload.DownloadServicer.DownloadThread;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Looper;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://192.168.1.5/android/test.zip";    private String downloadFile1 = "http://192.168.1.5/android/test1.exe";        //声明已经读过的长度变量    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();            }                      }    }    }

??转自:http://blog.csdn.net/oneRain88/archive/2011/04/14/6323387.aspx

?

  相关解决方案