- 浏览: 68973 次
- 性别:
- 来自: 上海
最新评论
-
kentihcai:
我这里的下载不了啊
android文件下载进度条实现 -
rabbitinhere:
程序确实是有点问题啊~~~ 2楼正解
android文件下载进度条实现 -
ssy341:
Datatables交流群
http://bbs.sailit ...
jQuery datatables使用 -
zjxkeven:
读取文件字节流时。修改成这样就没有问题了
while ((to ...
android文件下载进度条实现 -
zjxkeven:
我请求一个zip文件,后台下载文件有问题。费了好大劲才查出来。 ...
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地址,我用的是百度的音乐下载,在测试中发现百度每次生成的连接只能下载一次。
评论
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);
}
希望能帮助大家。
while ((total = input.read(buffer)) != -1) {
output.write(buffer, 0, total);
}
希望能帮助大家。
1 楼
zjxkeven
2012-09-18
我请求一个zip文件,后台下载文件有问题。费了好大劲才查出来。跟大家分享一下
发表评论
-
系统设置更改时间onConfigurationChanged
2011-08-13 12:15 1297在前一个例子中我们看到了屏幕方向的更改,事实上,当屏幕方向改变 ... -
android动态更改屏幕方向
2011-08-13 11:59 6659在androd中要通过程序改变屏幕显示的方向,必须覆盖setR ... -
Android - LayoutInflater 的使用
2011-08-05 09:10 973LayoutInflater is used to insta ... -
使用Shader渲染图形
2011-07-29 17:29 1548public class ShaderActivity ext ... -
android动画
2011-07-29 15:45 1253在Android系统中系统了两种动画实现方式:一种是Tween ... -
SQLite
2011-07-29 10:16 1975Android中通过SQLite数据库引擎来实现结构化数据 ... -
(转)android listview滑动时加载(动态加载)
2011-07-28 16:18 1821如果adapter中的数据量很大的时候,在加载listv ... -
Android-Intent和PendingIntent的关系
2011-07-28 16:03 1030本文转自:http://yinter.iteye.com/bl ... -
Broadcast Receiver处理广播事件
2011-07-28 13:56 2594本实例介绍自定义Broadcast Receiver和系统 ... -
Service实例
2011-07-28 10:04 961下面通过一个实例演示如何创建、启动、停止及绑定一个Servic ... -
菜单Menu
2011-07-27 17:07 940本实例主要介绍了android中的一些菜单,Android系 ... -
ListView组件与SimpleAdapter
2011-07-27 16:34 2006记录两个ListView的简单小例子.其中使用到 了Simpl ... -
WebView与ProgressDialog结合
2011-07-27 16:18 3188WebView组件支持直接加载网页,可以将其视为一个浏览器,要 ...
相关推荐
在Android开发中,文件复制和进度条的显示是常见的需求,尤其在移动应用中,用户可能需要将数据从一个位置移动到另一个位置,或者在后台下载文件时展示进度。`ProgressDialog`是Android SDK提供的一种对话框组件,...
在Android开发中,实现多文件下载并展示进度条是一项常见的需求。这涉及到网络编程、线程管理、数据存储以及UI更新等多个方面的知识。下面将详细解释如何在Android中实现这一功能。 1. **网络编程**:Android中进行...
### Android 文件下载进度条的实现 #### 背景与目的 在移动应用开发中,尤其是在Android平台上,文件下载是一项非常常见的功能需求。对于大型文件(如图片、视频等),提供一个进度条来显示下载进度不仅可以提升...
以上就是实现“android下载文件进度条时时更新”的主要技术点。通过这个项目,初学者可以深入理解Android的异步处理、文件I/O以及UI更新等核心概念。实践中,还可以进一步学习如何优化下载速度、处理多文件下载和...
总的来说,"android 文件上传含进度条"这个话题涵盖的知识点包括Android文件操作、网络编程、异步任务处理、UI更新机制以及可能的通知栏管理。理解并掌握这些,对于Android开发者来说至关重要,尤其是在优化用户体验...
1. AJAX异步下载:通过JavaScript的XMLHttpRequest对象,实现文件的分块下载,每次下载一部分并更新进度条,直到整个文件下载完毕。 2. HTML5 Blob和File API:利用这些API,开发者可以在浏览器端处理大文件,同时...
本篇将详细讲解如何在Android中实现圆形、矩形以及下载进度条,这些实现方法简单易懂,且具有较强的可扩展性。 首先,我们来看圆形进度条的实现。Android SDK提供了`ProgressBar`类,通过设置`android:...
在Android开发中,文件...总结一下,Android文件下载及进度条的实现涉及到网络请求、多线程、UI更新和异常处理等多个方面。理解并掌握这个过程对于Android开发者来说非常重要,因为这直接影响到应用的性能和用户体验。
这个压缩包"安卓进度条loadingprogress相关-Android多文件下载进度条.rar"似乎包含了一些资源和代码示例,帮助开发者实现多文件下载时的进度条显示。下面将详细探讨Android中如何实现这样的功能。 首先,`JavaApk...
下面将详细讲解如何在Android中实现一个下载进度条案例。 首先,我们需要在布局文件(如`activity_main.xml`)中设计进度条组件。Android提供了多种类型的进度条,如HorizontalProgressBar和CircularProgressBar。...
本篇文章将详细讲解如何利用`Service` 实现带有进度条的文件下载功能。 首先,我们需要创建一个`Service`,继承自`IntentService`或`Service`。`IntentService`更适合执行一次性任务,它会自动在线程中处理任务,并...
在Android开发中,实现文件下载并展示进度条是一项常见的需求。这个"android下载文件小例子,带进度条显示"的项目就是一个很好的学习素材,它涵盖了以下几个关键知识点: 1. **HTTP下载**:在这个示例中,开发者...
本文将深入探讨如何实现一个上下滚动的电池电量进度条,并根据电量百分比进行动态更新。 首先,我们需要了解Android中的进度条(ProgressBar)组件。Android SDK 提供了多种类型的进度条,包括Horizontal...
在Android开发中,进度条(ProgressBar)是一种常见的UI组件,用于显示某个操作的进度或等待状态。本教程将深入探讨如何实现一个具有特殊特性的长形进度条,它基于两个动态值并会在达到100%时自动消失。我们将通过...
下面将详细介绍如何实现一个“android圆角矩形进度条”。 首先,我们要明白Android中的进度条(ProgressBar)通常是线性的或圆形的,默认样式可能无法满足所有设计需求。为了创建圆角矩形进度条,我们需要自定义一...
【Android点击下载时Button背景变化下载进度条Demo】是一个Android开发中的示例项目,它展示了如何在用户触发下载操作时,使Button的背景发生变化,并同时显示一个下载进度条。这个Demo对于开发者来说,是一个很好的...
下面将详细讲解如何利用给定的代码实现Android文件下载进度条。 首先,我们需要理解布局文件`main.xml`。在这个布局文件中,有两个主要组件:一个`TextView`用于显示百分比进度,以及一个`ProgressBar`用于视觉化...
在Android应用开发中,文件下载和进度条显示是常见的需求,特别是在处理大文件时,进度条可以提供良好的用户体验。在提供的代码中,我们看到一个名为`AndroidDownLoadActivity`的类,它继承自`Activity`,实现了文件...
通过以上步骤,你就可以在Android应用中实现一个具有加载进度条的WebView了。这个功能对于提升用户体验至关重要,因为它让用户知道应用正在忙碌并给予加载过程的视觉反馈,降低了用户对等待时间的感知。同时,合理的...