`
zhujianjia
  • 浏览: 484153 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转:关于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

 

分享到:
评论

相关推荐

    android 学习心得

    根据提供的文档内容,我们可以深入探讨Android开发中的多个关键知识点,这些知识点对于初学者以及有一定经验的开发者来说都非常重要。下面将逐一分析: ### 一、Android-Manifest.xml – activity详细说明 `...

    我的android学习心得

    Android系统由多个组件构成,如Activity、Service、BroadcastReceiver和ContentProvider。Activity是用户界面的主要承载者,你需要了解如何创建和管理Activity的生命周期。Service用于后台运行任务,...

    android开发介绍及心得.docx

    ### Android开发介绍及心得 Android开发是指为Google的Android操作系统创建应用程序的过程。随着智能手机和平板电脑市场的迅猛发展,Android已成为全球范围内最受欢迎的操作系统之一。本文将深入探讨Android开发中...

    android开发介及心得.docx

    ### Android开发介绍与心得 #### 一、Android操作系统概述 Android是一个开源的移动操作系统,其核心基于Linux内核。该操作系统最初由Andy Rubin等人于2003年创建,并于2005年被Google收购。自那时起,Android迅速...

    基于Android Studio开发的旅游记录与分享APP源码,Android旅游路线记录与分享APP源码

    综上所述,这个基于Android Studio的旅游记录与分享APP涉及了众多Android开发的关键技术,包括地图集成、位置服务、数据存储、网络通信以及用户体验设计等多个方面,对于学习和提升Android开发能力具有很高的参考...

    android培训心得体会.doc

    除了基础知识,Android培训还会涉及进阶主题,如多线程处理、网络编程、数据存储(SQLite数据库、SharedPreferences、文件系统等)、通知和推送服务、异步任务和Loader、动画效果、权限管理以及性能优化等。...

    疯狂android 第三版

    该书在2015年6月由电子工业出版社出版,包含了作者对Android系统及应用开发的最新理解和实践心得。书中的内容覆盖了从基础到高级的各种主题,旨在帮助读者从新手迅速成长为专业的Android开发者。 书中可能包含的...

    Android的Intent实验

    前者仅启动服务并执行一次任务,后者同时建立连接,允许客户端和服务之间进行交互。 7. **广播Intent** 广播Intent用于向所有注册了相应接收器的组件发送消息。使用`sendBroadcast(Intent)`、`...

    android实现仿今日头条

    在Android平台上,仿今日头条的实现涉及多个核心知识点,包括用户界面设计、数据加载与解析、滑动刷新与下拉加载、新闻分类与详情展示、以及性能优化等方面。下面将逐一详细阐述这些关键点。 首先,**用户界面设计*...

    Beginning Android

    ### 关于《Beginning Android》的知识点总结 #### 一、书籍基本信息 - **书名**:《Beginning Android》第二版 - **作者**:Mark L. Murphy - **出版年份**:2010年 - **ISBN-13(平装本)**:978-1-4302-2629-1 -...

    疯狂android第三版 讲义pdf

    通过以上内容的详细介绍,我们可以看出《疯狂Android第三版讲义》不仅覆盖了Android开发的基础知识,还涉及到了很多高级特性和实用技巧,非常适合初学者入门以及进阶学习。希望每位学习者都能从中受益,成为一名优秀...

    Android五子棋实习设计任务书

    参考文献的选择涵盖了JAVA核心技术、Android开发实践、案例详解等多个方面,旨在为学生提供全面的学习资源,帮助他们顺利完成实习任务。 总的来说,这份实习设计任务书旨在让学生在实践中学习和掌握Android开发技能...

    安卓实习心得总结多篇.docx

    安卓实习心得总结多篇 Android 作为第一个系统,适用于移动端的,也...安卓实习心得总结多篇,涵盖了 Android 应用程序开发的一般流程、控件、布局、Activity、Service 等基础知识,以及在实习中学习到的经验和心得。

    精通android编程(第三版)

    - **增强的多任务处理能力**:用户可以在不同的应用程序之间快速切换,同时系统会自动保存每个应用的状态。 - **通知栏改进**:用户可以直接在下拉通知栏中控制音乐播放、查看邮件等操作。 - **虚拟键盘改进**:...

    android美食天下源代码

    【Android美食天下源代码】项目是一个综合性的移动应用开发实例,专为Android平台设计,旨在提供一个关于美食的全方位互动平台。这个项目不仅包含了客户端应用程序的源代码,还涉及到服务器端的搭建,使得用户可以...

    轻松学Android开发

    10. **多线程和异步处理**:在Android中,主线程负责UI更新,因此理解和使用AsyncTask、Handler、Looper以及最近的Coroutines是提高应用性能的关键。 11. **网络编程**:HTTP/HTTPS请求、WebSocket通信、JSON解析和...

    android学习记录

    这个链接指向了iteye博客上的一篇文章,可能是作者关于Android学习过程的详细记录,包含了学习心得、遇到的问题及解决方案,或者是一些实用的代码示例。访问这个链接,读者可以获取更具体的学习资源和实践指导。 ...

    Android高手过招 FAQ .zip

    在Android开发领域,高手过招往往意味着深入探讨技术细节、解决实际问题以及分享经验心得。这份"Android高手过招 FAQ .zip"压缩包文件显然包含了关于Android开发的一些常见问题和解答,旨在帮助开发者提升技能水平。...

Global site tag (gtag.js) - Google Analytics