`
jiava9900
  • 浏览: 86507 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

android文件下载进度条实现

    博客分类:
  • java
阅读更多
    做了个小例子,是关于android文件下载过程中进度条的实现,有些地方还有不当的地方,其中文件下载部分是参考mars老师的代码的,有兴趣可以去关注一下mars老师,http://www.mars-droid.com
代码写的比较乱,建议去看看mars老师的视频。
多话不说直接上代码了:
main.xml页面布局文件:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><textview  	android:id="@+id/textview"    android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="@string/hello"    /><button 	android:id="@+id/downloadtextbutton"	android:layout_width="fill_parent"	android:layout_height="wrap_content"	android:text="下载文本文件"/><button 	android:id="@+id/downloadmp3button"	android:layout_width="fill_parent"	android:layout_height="wrap_content"	android:text="下载mp3文件"/><edittext 	android:id="@+id/edittext"	android:layout_width="fill_parent"	android:layout_height="wrap_content"	android:hint="请出输入文字!"	android:lines="3"/><button 	android:id="@+id/textbutton"	android:layout_width="fill_parent"	android:layout_height="wrap_content"	android:text="测试"/></linearlayout>
 downloadactivity
public class downloadactivity extends activity {	public static final int dialog_download_progress = 0;//	public int filesize=0;//	public int downloadfilesize=0;		private textview textview;	private button downloadtextbutton;	private button downloadmp3button;	private button textbutton;	private edittext edittext;			private progressdialog dialog = null;	    /** called when the activity is first created. */    @override    public void oncreate(bundle savedinstancestate) {        super.oncreate(savedinstancestate);        setcontentview(r.layout.main);        downloadtextbutton = (button) this.findviewbyid(r.id.downloadtextbutton);        downloadmp3button = (button) this.findviewbyid(r.id.downloadmp3button);        //添加监听        downloadtextbutton.setonclicklistener(new downloadtextbuttonlistener());        downloadmp3button.setonclicklistener(new downloadmp3buttonlistener());                textview = (textview) this.findviewbyid(r.id.textview);        edittext = (edittext) this.findviewbyid(r.id.edittext);        textbutton = (button) this.findviewbyid(r.id.textbutton);        textbutton.setonclicklistener(new onclicklistener(){			@override			public void onclick(view v) {				textview.settext(edittext.gettext().tostring());				toast.maketext(downloadactivity.this, textview.gettext().tostring(), toast.length_long);			}        	        });            }    	@override	protected dialog oncreatedialog(int id) {		switch(id){			case dialog_download_progress:				dialog = new progressdialog(this);				dialog.setmessage("downloading…");				dialog.setprogressstyle(progressdialog.style_horizontal);				dialog.setcancelable(false);				dialog.show();				return dialog;			default:				return null;		}	}		private handler handler = new handler(){		@override		public void handlemessage(message msg) {			if(!thread.currentthread().isinterrupted()){				switch(msg.what){					case 0:						dialog.setmax(msg.arg1);						break;					case 1:						dialog.setprogress(msg.arg1);						break;					case 2:						dialog.dismiss();						break;					case -1:						string error = msg.getdata().getstring("error");			            toast.maketext(downloadactivity.this, error, 1).show();						break;									}			}			super.handlemessage(msg);		}	};	class downloadtextbuttonlistener implements onclicklistener{		/* (non-javadoc)		 * @see android.view.view.onclicklistener#onclick(android.view.view)		 */		@override		public void onclick(view v) {			// todo auto-generated method stub//			httpdownloader httpdownloader = new httpdownloader();//			string text = httpdownloader.download("http://zhangmenshiting.baidu.com/data/music/5789992/%e8%8d%b7%e5%a1%98%e6%9c%88%e8%89%b2.mp3?xcode=732ac4f76aeff611f08f3bb5c5f0aafe");		}    	    }        class downloadmp3buttonlistener implements onclicklistener{		/* (non-javadoc)		 * @see android.view.view.onclicklistener#onclick(android.view.view)		 */		@override		public void onclick(view v) {			//打开进度条			showdialog(dialog_download_progress);						thread t = new thread(runnable);			t.start();		}    	    }        runnable runnable = new runnable(){		@override		public void run() {			httpdownloader httpdownloader = new httpdownloader();						int result = httpdownloader.download(downloadactivity.this,"http://zhangmenshiting.baidu.com/data/music/5935874/%e6%ba%9c%e6%ba%9c%e7%9a%84%e6%83%85%e6%ad%8c.mp3?xcode=54e0a53865de98f9ba842c53eb1bf508", "music/", "e.mp3");						system.out.println(result);			string str =null;			if(result == 0){				str = "成功!";			}else if(result == 1){				str = "文件已存在!";			}else{				str = "失败!";			}			//			toast.maketext(downloadactivity.this, "下载结果"+str, toast.length_long).show();		}    	    };        public void sendmsg(int flag,int value){    	message message = new message();    	message.what = flag;    	message.arg1 = value;    	handler.sendmessage(message);    }    }
 下面两个为下载的工具类:
fileutils.java
public class fileutils {	private string sdpath;	/**	 * 	 */	public fileutils() {		// todo auto-generated constructor stub		//获得当前外部存储设备的目录		sdpath = environment.getexternalstoragedirectory()+"/";	}	/**	 * 在sd卡上创建文件	 * @param filename	 * @return	 */	public file createsdfile(string filename){		file file = new file(sdpath + filename);		try {			file.createnewfile();		} catch (ioexception e) {			// todo auto-generated catch block			e.printstacktrace();		}				return file;	}		/**	 * 创建sd卡目录	 * @param dirname	 * @return	 */	public file createsddir(string dirname){		file file = new file(sdpath + dirname);		file.mkdir();				return file;	}		public boolean isfileexist(string filename){		file file = new file(sdpath + filename);				return file.exists();			}		public file writetosdfrominput(context context,string path,string filename,inputstream input){		file file = null;		outputstream output = null;				try {			createsddir(path);			file = createsdfile(path + filename);			output = new fileoutputstream(file);						byte[] buffer = new byte[4 * 1024];			int total = 0;			while((input.read(buffer)) != -1){				total = total + buffer.length;				output.write(buffer);				//更新下载进度条				((downloadactivity)context).sendmsg(1,total);			}			output.flush();		} catch (filenotfoundexception e) {			// todo auto-generated catch block			e.printstacktrace();		} catch (ioexception e) {			// todo auto-generated catch block			e.printstacktrace();		}finally{			try {				output.close();			} catch (ioexception e) {				// todo auto-generated catch block				e.printstacktrace();			}		}		//下载完成		((downloadactivity)context).sendmsg(2,0);		return file;	}	}
 httpdownloader.java
public class httpdownloader {	private url url = null;	/**	 * 根据url下载文件,前提是文件当中的内容为文本,返回值就是文件当中的内容	 * @param urlstr	 * @return	 */	public string download(string urlstr){				stringbuffer buffer = new stringbuffer();		string line = null;		bufferedreader reader = null;				try {			url = new url(urlstr);			try {				httpurlconnection conn = (httpurlconnection) url.openconnection();				reader = new bufferedreader(new inputstreamreader(conn.getinputstream()));				while ((line = reader.readline()) != null) {					buffer.append(line);				}			} catch (ioexception e) {				log.e("io", "httpurlconnection -> ioexception");				e.printstacktrace();			}					} catch (malformedurlexception e) {			log.e("url","url -> malformedurlexception");			e.printstacktrace();		}finally{			try {				reader.close();			} catch (ioexception e) {				// todo auto-generated catch block				e.printstacktrace();			}		}		return buffer.tostring();			}	/**	 * 该函数返回整形: -1代表下载出错,0代表下载成功,1代表下载文件已存在	 * @param urlstr	 * @param path	 * @param filename	 * @return	 */	public int download(context context,string urlstr,string path,string filename){		inputstream input = null;		fileutils fileutils = new fileutils();		if(fileutils.isfileexist(path + filename)){			((downloadactivity)context).sendmsg(2,0);			return 1;		}else{			try {				input = getinputstreamfromurl(context,urlstr);			} catch (ioexception e) {				// todo auto-generated catch block				e.printstacktrace();			}			file resultfile = fileutils.writetosdfrominput(context,path, filename, input);			if(resultfile == null){				return -1;			}		}		return 0;	}		public inputstream getinputstreamfromurl(context context,string urlstr) throws ioexception{		url = new url(urlstr);		httpurlconnection conn = (httpurlconnection) url.openconnection();				inputstream s = conn.getinputstream();				((downloadactivity)context).sendmsg(0,conn.getcontentlength());				return s;	}}
 别忘记添加:
<uses-permission android:name="android.permission.internet"/>    <uses-permission android:name="android.permission.write_external_storage" />
 
下面是运行的结果图:
<br><img src="http://dl.iteye.com/upload/attachment/542902/436e7a0a-9d1e-382d-acfe-ec03476fb174.jpg" alt=""><br> 正在下载:
<br><img src="http://dl.iteye.com/upload/attachment/542904/5c500466-85e0-31d4-aa07-507d68d74e93.jpg" alt=""><br> 下载完成之后,我们在sdcard/music可以看到f.mp3文件
<br><img src="http://dl.iteye.com/upload/attachment/542907/728e1b4e-8dc4-36cf-ae1a-b4010f60f635.jpg" alt="" width="627" height="340"><br> 下面附上源码,可以自己修改,在例子中我是通过直接弹出的方式显示进度条的,这样在下载的时候我们就不能做其他的事情了,我们可以在布局文件中显示进度条,这样我们在下载的时候可以在文本框中输入一下内容,点击测试按钮之后文本框中的内容可以在上面的textview中显示出来。
<span style="color: #ff0000;">如果运行本例子,需要更改下载的url地址,我用的是百度的音乐下载,在测试中发现百度每次生成的连接只能下载一次。</span>
 
0
0
分享到:
评论

相关推荐

    文件复制及进度条 android 文件复制 进度条 progressdialog

    在Android开发中,文件复制和进度条的显示是常见的需求,尤其在移动应用中,用户可能需要将数据从一个位置移动到另一个位置,或者在后台下载文件时展示进度。`ProgressDialog`是Android SDK提供的一种对话框组件,...

    Android 多文件下载进度条

    在Android开发中,实现多文件下载并展示进度条是一项常见的需求。这涉及到网络编程、线程管理、数据存储以及UI更新等多个方面的知识。下面将详细解释如何在Android中实现这一功能。 1. **网络编程**:Android中进行...

    \Android文件下载进度条的实现.txt

    ### Android 文件下载进度条的实现 #### 背景与目的 在移动应用开发中,尤其是在Android平台上,文件下载是一项非常常见的功能需求。对于大型文件(如图片、视频等),提供一个进度条来显示下载进度不仅可以提升...

    android下载文件进度条时时更新

    以上就是实现“android下载文件进度条时时更新”的主要技术点。通过这个项目,初学者可以深入理解Android的异步处理、文件I/O以及UI更新等核心概念。实践中,还可以进一步学习如何优化下载速度、处理多文件下载和...

    android 文件上传含进度条

    总的来说,"android 文件上传含进度条"这个话题涵盖的知识点包括Android文件操作、网络编程、异步任务处理、UI更新机制以及可能的通知栏管理。理解并掌握这些,对于Android开发者来说至关重要,尤其是在优化用户体验...

    文件下载带进度条的哦很实用

    1. AJAX异步下载:通过JavaScript的XMLHttpRequest对象,实现文件的分块下载,每次下载一部分并更新进度条,直到整个文件下载完毕。 2. HTML5 Blob和File API:利用这些API,开发者可以在浏览器端处理大文件,同时...

    Android 圆形进度条,矩形进度条以及下载进度条的实现,实现过程简单明了,扩展性强。

    本篇将详细讲解如何在Android中实现圆形、矩形以及下载进度条,这些实现方法简单易懂,且具有较强的可扩展性。 首先,我们来看圆形进度条的实现。Android SDK提供了`ProgressBar`类,通过设置`android:...

    android 文件下载及进度条

    在Android开发中,文件...总结一下,Android文件下载及进度条的实现涉及到网络请求、多线程、UI更新和异常处理等多个方面。理解并掌握这个过程对于Android开发者来说非常重要,因为这直接影响到应用的性能和用户体验。

    安卓进度条loadingprogress相关-Android多文件下载进度条.rar

    这个压缩包"安卓进度条loadingprogress相关-Android多文件下载进度条.rar"似乎包含了一些资源和代码示例,帮助开发者实现多文件下载时的进度条显示。下面将详细探讨Android中如何实现这样的功能。 首先,`JavaApk...

    Android下载进度条案例

    下面将详细讲解如何在Android中实现一个下载进度条案例。 首先,我们需要在布局文件(如`activity_main.xml`)中设计进度条组件。Android提供了多种类型的进度条,如HorizontalProgressBar和CircularProgressBar。...

    android service 带进度条下载功能原理

    本篇文章将详细讲解如何利用`Service` 实现带有进度条的文件下载功能。 首先,我们需要创建一个`Service`,继承自`IntentService`或`Service`。`IntentService`更适合执行一次性任务,它会自动在线程中处理任务,并...

    android下载文件小例子,带进度条显示

    在Android开发中,实现文件下载并展示进度条是一项常见的需求。这个"android下载文件小例子,带进度条显示"的项目就是一个很好的学习素材,它涵盖了以下几个关键知识点: 1. **HTTP下载**:在这个示例中,开发者...

    Android 电池电量进度条,上下滚动图片的进度条(battery)

    本文将深入探讨如何实现一个上下滚动的电池电量进度条,并根据电量百分比进行动态更新。 首先,我们需要了解Android中的进度条(ProgressBar)组件。Android SDK 提供了多种类型的进度条,包括Horizontal...

    Android 长形进度条的实现

    在Android开发中,进度条(ProgressBar)是一种常见的UI组件,用于显示某个操作的进度或等待状态。本教程将深入探讨如何实现一个具有特殊特性的长形进度条,它基于两个动态值并会在达到100%时自动消失。我们将通过...

    android圆角矩形进度条

    下面将详细介绍如何实现一个“android圆角矩形进度条”。 首先,我们要明白Android中的进度条(ProgressBar)通常是线性的或圆形的,默认样式可能无法满足所有设计需求。为了创建圆角矩形进度条,我们需要自定义一...

    Android点击下载时候Button背景变化下载进度条Demo

    【Android点击下载时Button背景变化下载进度条Demo】是一个Android开发中的示例项目,它展示了如何在用户触发下载操作时,使Button的背景发生变化,并同时显示一个下载进度条。这个Demo对于开发者来说,是一个很好的...

    Android文件下载进度条的实现代码

    下面将详细讲解如何利用给定的代码实现Android文件下载进度条。 首先,我们需要理解布局文件`main.xml`。在这个布局文件中,有两个主要组件:一个`TextView`用于显示百分比进度,以及一个`ProgressBar`用于视觉化...

    android 文件下载及进度条.pdf

    在Android应用开发中,文件下载和进度条显示是常见的需求,特别是在处理大文件时,进度条可以提供良好的用户体验。在提供的代码中,我们看到一个名为`AndroidDownLoadActivity`的类,它继承自`Activity`,实现了文件...

    Android 加载网页进度条.zip

    通过以上步骤,你就可以在Android应用中实现一个具有加载进度条的WebView了。这个功能对于提升用户体验至关重要,因为它让用户知道应用正在忙碌并给予加载过程的视觉反馈,降低了用户对等待时间的感知。同时,合理的...

Global site tag (gtag.js) - Google Analytics