/** * 断点续传 * @param url */ private void duanDianXuChuan(final String url){ try { Runnable r = new Runnable() { @Override public void run() { getRemoteFile(url); } }; new Thread(r).start(); } catch (Exception e) { e.printStackTrace(); } } /** * 下载远端文件 * @param urlString */ private void getRemoteFile(String urlString){ try{ File file; if(mCurSize == 0){ file = File.createTempFile(fileNa, fileEx); currentTempFilePath = file.getAbsolutePath(); Log.e(“andy”,file.getName() + ” has exists.”); } else { file = new File(currentTempFilePath); FileInputStream fis = new FileInputStream(file); mCurSize = fis.available(); Log.e(“andy”,file.getName() + ” has ” + mCurSize + ” bytes.”); } URL url = new URL(urlString); HttpURLConnection httpConnection = (HttpURLConnection) url .openConnection(); httpConnection.setRequestProperty(“User-Agent”, “NetFox”); String sProperty = “bytes=” + mCurSize + “-”; httpConnection.setRequestProperty(“RANGE”, sProperty); InputStream is = httpConnection.getInputStream(); Log.e(“andy”,”mTempFileName = ” + mTempFileName); /*将文件写入暂存盘*/ FileOutputStream fos = new FileOutputStream(file, true); byte buf[] = new byte[512]; do { int numread = is.read(buf); if (numread <= 0) { mHandler.sendEmptyMessageDelayed(this.DOWNLOAD_FINISH, 0); break; } mCurSize += numread; mHandler.sendEmptyMessageDelayed(this.UPDATE_DOWNLOAD_PROGRESS, 0); Log.e(“andy”,”current size = ” + mCurSize); fos.write(buf, 0, numread); }while (mContinue); /*打开文件进行安装*/ if(mCurSize == mSize) { mCurSize = 0; openFile(file); } try { is.close(); } catch (Exception ex) { Log.e(“andy”, “error: ” + ex.getMessage(), ex); } }catch(Exception e){ e.printStackTrace(); } } /** * 获得文件长度 * @param urlString * @return */ public long getFileSize(String urlString) { int nFileLength = -1; try { URL url = new URL(urlString); HttpURLConnection httpConnection = (HttpURLConnection) url .openConnection(); httpConnection.setRequestProperty(“User-Agent”, “NetFox”); int responseCode = httpConnection.getResponseCode(); if (responseCode >= 400) { return -2; // -2 represent access is error } String sHeader; for (int i = 1;; i++) { sHeader = httpConnection.getHeaderFieldKey(i); if (sHeader != null) { if (sHeader.equals(“content-length”)) { nFileLength = Integer.parseInt(httpConnection .getHeaderField(sHeader)); break; } } else break; } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return nFileLength; } /** * 计算百分比 * @param p1 * @param p2 * @return */ public static String percent(double p1, double p2) { String str; double p3 = p1 / p2; NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMinimumFractionDigits(2); str = nf.format(p3); Log.e(“andy”,”percentage = ” + str); return str; }
相关推荐
在Android平台上实现断点续传是一项重要的技术,它允许用户在网络连接不稳定或中断后,能够从上次停止的地方继续下载大文件,而不是从头开始。断点续传在移动设备上尤其重要,因为移动网络的不可预测性和数据限制...
OKHttp3是如今非常流行的Android网络请求框架,那么如何利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用RxJava来实现线程的切换,并且开启Java8...
二、Android实现断点续传的关键步骤 1. **文件存储**:首先,需要在本地创建一个临时文件,用于存放正在下载的数据。这个临时文件会在下载完成后与原始文件合并。 2. **检查已下载状态**:启动下载前,检查本地是否...
本文将详细介绍如何利用HttpURLConnection实现Android应用中的断点续传功能。 首先,理解断点续传的概念。断点续传是指当下载或上传文件过程中因网络问题中断后,可以从上次中断的位置继续进行,而不是重新开始。这...
在Android平台上,文件下载是一项常见的任务,特别是在处理大型文件或多媒体资源时,为了提升用户体验,开发者通常会采用多线程下载并实现断点续传功能。断点续传允许用户在下载过程中暂停、恢复,避免因网络问题或...
在实现断点续传时,需要注意安全问题,例如防止恶意攻击者通过伪造Range头请求服务器的任意部分,以及确保下载的文件完整性,可以通过校验码(如MD5或SHA-1)来验证。 9. 资源管理: 在下载过程中,应合理管理内存...
4. **断点续传**:实现断点续传功能是为了在用户网络不稳定时避免下载重头开始。这需要保存每次下载的进度,并在下次启动下载时恢复。Android提供了`DownloadManager`系统服务,它可以自动处理网络中断和恢复,支持...
通过这个"MultiThreadDownload"项目,开发者可以学习到如何在Android中实现多线程断点续传下载,理解其背后的原理和技术细节,这对于提升应用的下载性能和用户体验非常有帮助。记得阅读源代码中的注释,它们会进一步...
总之,Android SDK 3.0为开发者提供了断点续传的支持,通过HttpURLConnection的特性,可以创建高效且用户友好的下载体验。在实际应用中,需要结合文件I/O、网络连接管理和用户界面设计等多个方面进行综合考虑。
1. **文件分块下载**:为了实现断点续传,首先需要将大文件分成多个小块进行下载。每个块都有自己的开始和结束位置,这样即使在下载过程中中断,也能精确地知道哪些块已经完成,哪些尚未下载。 2. **HTTP Range请求...
Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)
在Android平台上,实现文件下载,特别是支持断点续传和进度显示,是移动应用开发中的常见需求。这有助于用户在不稳定的网络环境下高效地下载大文件,并提供良好的用户体验。以下是对这些知识点的详细讲解: 一、...
为了实现断点续传,需要持久化保存每个文件块的下载状态,包括已下载的字节数、是否已完成等信息。SQLite数据库可以方便地实现这一功能。 5. **创建下载工具类**: 工具类应包含以下方法: - `startDownload...
在Android平台上实现FTP断点续传下载功能,可以极大地提高用户下载大文件的效率和体验。断点续传允许应用程序在文件下载中断后从上次停止的地方继续,而不是重新开始整个下载过程。以下是对这一主题的详细阐述: 1....
同时,为了实现断点续传,我们需要在每次下载开始时检查本地是否存在目标文件以及其已下载的大小,以此作为新的起点。 广播接收器(BroadcastReceiver)在这里的角色是传递下载进度到UI界面。当下载进度发生变化时...
这样,当应用重启或下载中断时,可以从数据库中获取这些信息,实现断点续传。 4. **文件流操作**:下载过程中,需要使用输入/输出流来处理网络和本地文件。InputStream用于从网络读取数据,OutputStream用于将数据...
2. Android实现断点续传的关键组件: - 文件系统:用于存储已下载的文件片段。 - SQLite数据库:保存文件的元数据,如总大小、已下载的字节数、文件名等。 - HTTP请求头:在HTTP请求中设置`Range`头字段,指示服务器...
本项目“Android ftp断点续传Demo”旨在演示如何在Android应用中实现FTP客户端功能,支持断点续传,即在中断后能够从上次停止的地方继续传输文件,这对于大文件的传输尤其有用。以下将详细介绍该Demo涉及的关键知识...
在Unity游戏开发中,断点续传是一种非常实用的技术,特别是在处理大文件下载时,能够提高用户体验并降低服务器压力。断点续传允许用户在中断网络连接后从上次停止的地方继续下载,而不是重新开始。本示例将详细介绍...