`
jiava9900
  • 浏览: 82987 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics