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();
            } 
           
        }
    }
   
}

时间: 2024-11-03 14:03:37

android多任务同时下载的相关文章

android 多线程断点续传下载 一

想做一个下载功能,当然理想的功能要支持多任务同时下载,断点续传的功能,我想一步一步来,首先困难摆在了多任务这里 开始我的思路是在一个Service中启动下载的流操作,然后通过Service中声明一个Activity中的Handler更新UI(比如进度条...) 可是我发现在Service中声明一个Activity中的Handler是做不到的(可能只是我做不到吧,无法申请内存) 于是,我决定在Activity中直接启动线程,让其运行,调用自身的Handler来更新UI,没想到在这个下载Activi

android源码下载方式

android源码下载方式: 方式一: 1) 创建~/bin $ mkdir ~/bin$ PATH=~/bin:$PATH 2) 下载repo $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo$ chmod a+x ~/bin/repo 3) 创建保存Android源码文件 $ mkdir WORKING_DIRECTORY$ cd WORKING_DIRECTORY 4 ) 下载Androi

android 从ftp下载sqlite数据库后覆盖原有数据库,为什么不能运行?

问题描述 android 从ftp下载sqlite数据库后覆盖原有数据库,为什么不能运行? android的sqlite数据库,存在data/data/packagename/databases/下, 用org.apache.commons.net.ftp.FTPClient 上传数据库到ftp,再下载下来后,为什么提示损坏,打不开? 我测试过,ftp上的文件是正确的,下载也成功了,文件有更新,文件的大小和ftp上的也是一样的.但是为什么打不开呢?用sqlexpert打开sqlite,提示dat

Android源码下载及开发环境的搭建

1.前言         前一博文给自己列了一下Android的学习计划,是时候一个个的完成了.如计划列的,我要写的第一篇是<Android源码 的下载及开发环境的搭建>,致于如何去下载源码,其实网上已经一大堆的帖子了,一搜就有.但在这里,我想说,一个源码的下载,不是简单的把源码下载下来之 样就OK了,就可以开始你的源码学习之旅.要想更好的学习源码和进行开发,一个适合自己的开发环境还是必不可少的,这里我会列出来我给自己准备的开发环境 的做法,不能说明是最优的,但至少我感觉对我来说还是挺方便的.

android 多线程断点续传下载 三

今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基本要领,我们先一起简单回顾下它的基本原理. http://blog.csdn.net/shimiso/article/details/6763664  android 多线程断点续传下载 一 http://blog.csdn.net/shimiso/article/details/6763986 

摄像头-linux上传完文件后,另一台Android手机自动下载这个可以实现么

问题描述 linux上传完文件后,另一台Android手机自动下载这个可以实现么 linux我用摄像头拍照上传到ftp去 但是我Android要一直看着ftp才能把它下下来 可以让它自动判断ftp状态 然后上传完了自动下下来么 解决方案 如果是简单的学生习作程序,另一个程序不断轮询服务器就可以了.

Android实现多线程下载图片的方法_Android

很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天整理出两种比较好的方法来实现远程图片的下载.  方法一.直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection 或URLConnection也可以. static Bitmap downloadBitmap

Android版多线程下载 仿下载助手(最新)_Android

首先声明一点: 这里的多线程下载并不是指多个线程下载一个 文件,而是每个线程负责一个文件,今天给大家分享一个多线程下载的 例子.先看一下效果,点击下载开始下载,同时显示下载进度,下载完成,变成程安装,点击安装提示安装应用. 界面效果图: 线程池ThreadPoolExecutor ,先简单学习下这个线程池的使用 /** * Parameters: corePoolSize the number of threads to keep in the pool, even if they are id

Android通过SOCKET下载文件的方法_Android

本文实例讲述了Android通过SOCKET下载文件的方法.分享给大家供大家参考,具体如下: 服务端代码 import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.