`
xiehongdong
  • 浏览: 69195 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android文件下载进度条实现

阅读更多

做了个小例子,是关于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" />

 

下面是运行的结果图:



 正在下载:



 下载完成之后,我们在sdcard/music可以看到f.mp3文件



 下面附上源码,可以自己修改,在例子中我是通过直接弹出的方式显示进度条的,这样在下载的时候我们就不能做其他的事情了,我们可以在布局文件中显示进度条,这样我们在下载的时候可以在文本框中输入一下内容,点击测试按钮之后文本框中的内容可以在上面的TextView中显示出来。

如果运行本例子,需要更改下载的url地址,我用的是百度的音乐下载,在测试中发现百度每次生成的连接只能下载一次。

  • 大小: 18.8 KB
  • 大小: 20.8 KB
  • 大小: 34.1 KB
分享到:
评论
4 楼 kentihcai 2014-08-11  
我这里的下载不了啊
3 楼 rabbitinhere 2014-06-18  
程序确实是有点问题啊~~~   2楼正解
2 楼 zjxkeven 2012-09-18  
读取文件字节流时。修改成这样就没有问题了
while ((total = input.read(buffer)) != -1) {
    output.write(buffer, 0, total);
}
希望能帮助大家。
1 楼 zjxkeven 2012-09-18  
我请求一个zip文件,后台下载文件有问题。费了好大劲才查出来。跟大家分享一下

相关推荐

    文件复制及进度条 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