Download.java
package com.wansha; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import com.wansha.download.util.DownloadUtil; public class Download extends Activity { private ProgressBar bar1; private Button downFile; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.bar1 = (ProgressBar)this.findViewById(R.id.bar1); this.downFile = (Button)this.findViewById(R.id.downfile); this.downFile.setOnClickListener(new downFileListener()); } class downFileListener implements OnClickListener{ public void onClick(View arg0) { bar1.setVisibility(View.VISIBLE); DownloadUtil downloadutil = new DownloadUtil(); downloadutil.Save2SDCard("http://192.168.0.137:8080/navigater/admin/SSHDemo.zip", "peng/", "sharp.zip"); } } Handler handler = new Handler(){ public void handleMessage(Message msg) { Log.d("mydebug", "hehh!" + msg.arg1); bar1.setProgress(msg.arg1); if(msg.arg1==100){ bar1.setVisibility(View.GONE); } }; }; } DownloadFile.java
package com.wansha.download.util; import java.io.BufferedInputStream; import java.io.File; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.util.Log; public class DownloadFile { private File file; private String url; private String fileName; private int startPos; private int endPos; private long totalSize; private int threadNumTotal =1; private int currentThread =1; private static int BUFFER_SIZE = 1024*80; public int getBUFFER_SIZE() { return BUFFER_SIZE; } public int getThreadNumTotal() { return threadNumTotal; } public void setThreadNumTotal(int threadNumTotal) { this.threadNumTotal = threadNumTotal; } public int getCurrentThread() { return currentThread; } public void setCurrentThread(int currentThread) { this.currentThread = currentThread; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getStartPos() { return startPos; } public void setStartPos(int startPos) { this.startPos = startPos; } public int getEndPos() { return endPos; } public void setEndPos(int endPos) { this.endPos = endPos; } public long getTotalSize() { return totalSize; } public void setTotalSize(long totalSize) { this.totalSize = totalSize; } public long getURLTotalSize() { try{ URL url = new URL(this.url); HttpURLConnection httpConn = (HttpURLConnection)url.openConnection(); httpConn.setRequestMethod("GET"); //以GET方式连接 if(httpConn.getResponseCode() == HttpURLConnection.HTTP_OK){ return httpConn.getContentLength(); } }catch(Exception ex){ ex.printStackTrace(); return 0; } return 0; } public InputStream getInputStreamByThreadNum(){ InputStream is = null; try{ if(this.url != null && !"".equals(this.url)){ long urlTotalSize = getURLTotalSize(); Log.d("mydebug", "threadNumTotal " + this.threadNumTotal); long spanSize = (long)Math.ceil((float)urlTotalSize/this.threadNumTotal); Log.d("mydebug", "spanSize " + spanSize); this.setStartPos((int)((this.currentThread-1)*spanSize)); int ends = (int)(this.currentThread*spanSize-1); if(ends > urlTotalSize){ this.setEndPos((int)urlTotalSize-1); }else{ this.setEndPos(ends); } URL url = new URL(this.url); HttpURLConnection httpConn = (HttpURLConnection)url.openConnection(); httpConn.setRequestMethod("GET"); //以GET方式连接 httpConn.setRequestProperty("Connection", "Keep-Alive"); //保持一直连接 httpConn.setConnectTimeout(60 * 1000 * 5); //连接超时5分钟 httpConn.setAllowUserInteraction(true); httpConn.setRequestProperty("Range", "bytes=" + getStartPos() + "-" + getEndPos()); Log.d("mydebug", " " + getStartPos() + " " + getEndPos()); is = new BufferedInputStream(httpConn.getInputStream(),DownloadFile.BUFFER_SIZE); } }catch(Exception ex){ ex.printStackTrace(); } return is; } public InputStream getInputStreamByPos(){ try{ if(this.url != null && !"".equals(this.url)){ if(this.startPos != 0 || this.endPos != 0){ URL url = new URL(this.url); HttpURLConnection httpConn = (HttpURLConnection)url.openConnection(); httpConn.setRequestMethod("GET"); //以GET方式连接 httpConn.setRequestProperty("Connection", "Keep-Alive"); //保持一直连接 httpConn.setConnectTimeout(60 * 1000 * 5); //连接超时5分钟 httpConn.setAllowUserInteraction(true); httpConn.setRequestProperty("Range", "bytes=" + getStartPos() + "-" + getEndPos()); Log.d("mydebug", "readding....6 " + httpConn.getResponseCode()); // if(httpConn.getResponseCode() == HttpURLConnection.HTTP_OK){ Log.d("mydebug", "readding....8 " + this.startPos + "````````````````````````" + this.endPos); Log.d("mydebug", "hello world"); // httpConn.setRequestProperty("Range", "bytes=" + getStartPos() + "-" + getEndPos()); Log.d("mydebug", "start ------>" + this.startPos + " endPos" + this.endPos); Log.d("mydebug", "readding....7"); return new BufferedInputStream(httpConn.getInputStream(),DownloadFile.BUFFER_SIZE); // } } } }catch(Exception ex){ ex.printStackTrace(); return null; } return null; } public static void main(String[] args) throws Exception { DownloadFile downloadFile = new DownloadFile(); downloadFile.setUrl("http://www.baidu.com/index.html"); downloadFile.getInputStreamByPos(); } } DownloadUtil.java
package com.wansha.download.util; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; public class DownloadUtil { private static int threadNum = 10; private int sign = 0; public static int getThreadNum() { return threadNum; } public static void setThreadNum(int threadNum) { DownloadUtil.threadNum = threadNum; } public DownloadUtil(){ } private final static String SDPATH = Environment.getExternalStorageDirectory().getPath() + "/"; public boolean isExistFile(String filePath){ File file = new File(filePath); return file.exists(); } public void createDir(String dirPath){ if(dirPath != null || !"".equals(dirPath)){ File file = new File(dirPath); if(!file.isDirectory()){ file.mkdirs(); } } } public int Save2SDCard(String urlAddress, String saveDir, String fileName){ createDir(DownloadUtil.SDPATH + saveDir); try{ File file = new File(DownloadUtil.SDPATH + saveDir, fileName); Log.d("mydebug", "fileName....1" + DownloadUtil.SDPATH + saveDir + fileName); if(file.exists())file.delete(); ExecutorService service = Executors.newFixedThreadPool(10); CountDownLatch countDownLatch = new CountDownLatch(DownloadUtil.threadNum); Log.d("mydebug", "readding....1"); for(int i=1; i<=DownloadUtil.threadNum; i++){ Log.d("mydebug", "readding....2"); DownloadFile downloadFile = new DownloadFile(); downloadFile.setUrl(urlAddress); downloadFile.setThreadNumTotal(DownloadUtil.threadNum); downloadFile.setCurrentThread(i); RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rwd"); // boolean flag = this.handler.post(new SaveFileThread(countDownLatch, this.handler)); service.execute(new SaveFileThread(randomAccessFile, downloadFile, countDownLatch)); } countDownLatch.await(); service.shutdown(); Log.d("mydebug", "download is finish!"); return 0; }catch(Exception ex){ ex.printStackTrace(); return -1; } } class MyRunnable implements Runnable{ private Handler handler; public MyRunnable(){ } public MyRunnable(Handler handler){ this.handler = handler; } public void run() { sign += 10; Message message = this.handler.obtainMessage(); message.arg1 = sign; try{ Thread.sleep(2000); }catch(Exception ex){ ex.printStackTrace(); } this.handler.sendMessage(message); }; }; class SaveFileThread implements Runnable{ private RandomAccessFile randomFile; private DownloadFile downloadFile; private CountDownLatch countDownLatch; public SaveFileThread() { } public SaveFileThread(RandomAccessFile randomFile, DownloadFile downloadFile, CountDownLatch countDownLatch) { this.randomFile = randomFile; this.downloadFile = downloadFile; this.countDownLatch = countDownLatch; } public void run() { try{ InputStream is = this.downloadFile.getInputStreamByThreadNum(); this.randomFile.seek(this.downloadFile.getStartPos()); byte[] by = new byte[1024*80]; int length = 0; while(-1 != (length = is.read(by))){ this.randomFile.write(by, 0, length); } is.close(); this.randomFile.close(); this.countDownLatch.countDown(); }catch(Exception ex){ ex.printStackTrace(); } } } }
您还没有登录,请您登录后再发表评论
本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程,提高效率,并确保应用的响应性。 一、多线程基础 多线程是并发执行多个任务的能力,它允许应用程序同时处理多个任务,提高...
综上所述,"Android多线程下载文件"是一个涉及多方面技术的复杂任务,包括多线程编程、数据库操作、文件I/O、错误处理等。通过合理的设计和实现,我们可以创建一个高效、可靠的下载系统,为用户提供无缝的下载体验。
总之,这个Android多线程断点续传下载器项目涵盖了Android开发中的许多关键知识点,包括多线程编程、文件操作、网络请求、服务、数据持久化以及用户界面更新等,对于提升Android开发技能具有很高的实践价值。...
通过以上步骤,我们可以实现一个功能完善的Android多线程下载器,它支持暂停、断点续传,并能够根据用户需求进行定制。在项目实践中,务必注意线程同步和数据一致性,以保证下载的正确性。 最后,提供的...
总结,Android多线程下载是提升用户体验的重要手段,通过合理地划分任务、并发执行、同步合并,以及断点续传,可以有效地提高下载效率,减少用户等待时间。`demo.apk`是一个很好的实践案例,值得开发者深入研究。
在Android开发中,多线程断点下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并确保下载的连续性。这里我们将深入探讨这一主题,包括其原理、实现方式以及如何更新ListView...
在Android应用开发中,...总的来说,Android多线程下载结合断点续传技术,能够优化用户体验,提高下载效率。实际开发时,需要根据项目需求选择合适的实现方式,同时注意线程安全和资源管理,以确保程序的稳定性和性能。
通过以上步骤,我们可以构建一个功能完善的Android多线程断点下载应用,结合ListView展示下载任务,提供良好的用户交互体验。在实际开发中,还需要考虑各种边缘情况,进行充分的测试,以确保系统的稳定性和可靠性。
在Android开发中,多线程技术常常用于提升应用程序的性能,特别是在处理耗时操作,如文件下载时。这个"多线程分别下载文件"的Demo是针对在ListView或GridView控件中实现的一项功能,允许用户选择多个文件进行并行...
在Android开发中,多线程、断点续传和同时下载多个大文件是优化用户体验和提高应用程序性能的关键技术。下面将详细阐述这些知识点,并提供如何实现的指导。 **多线程** 多线程是Android应用中处理耗时操作的重要...
总之,Android多线程下载涉及到了Android线程模型、并发控制、文件操作等多个方面,需要开发者有扎实的基础知识和实践经验。通过合理利用多线程,不仅可以提升应用性能,还能提高用户满意度。在实际开发中,要根据...
综上所述,这个"android 多线程下载源代码"涵盖了Android并发编程、网络通信、文件操作等多个重要知识点,对于提升Android开发者处理大文件下载的能力非常有帮助。通过深入学习和实践,开发者可以更好地理解和掌握...
在Android平台上,多线程下载机制是提升应用性能和用户体验的关键技术之一,特别是在处理大文件如应用程序、视频或音频资源的下载场景中。通过利用多线程,我们可以将一个大文件分割成多个小部分,然后同时启动多个...
总的来说,实现Android多线程下载涉及网络请求、线程管理、文件操作、数据同步等多个方面。开发者需要熟悉Android的并发编程模型,了解网络编程的基础知识,并掌握文件I/O的操作。通过这样的实践,不仅可以提高应用...
综上所述,Android多线程断点续传下载涉及到网络请求、多线程管理、文件操作、错误处理等多个方面,是实现高效、稳定下载功能的关键技术。在实际开发中,可以参考开源库如`Volley`、`OkHttp`、`DownloadManager`等,...
本示例"android 多线程 下载 更新 ui 例子"旨在教你如何在Android环境中使用多线程进行文件下载,并实时更新UI来显示下载进度。 在Android主线程中,我们不能执行长时间运行的任务,因为这会导致应用程序无响应...
在Android开发中,文件下载是一项常见的任务,尤其是对于大型应用或者资源更新,多线程下载技术则显得尤为重要。本文将详细解析如何在Android环境中实现文件的多线程下载,包括自定义线程数、断点续传以及下载任务的...
在Android开发中,多线程断点续传...总之,Android多线程断点续传下载技术是提高用户体验的重要手段,涉及到了网络编程、多线程、文件操作、线程通信等多个技术领域,需要开发者具备扎实的基础和良好的问题解决能力。
Android提供了一个系统级别的`DownloadManager`服务,它可以处理文件的断点续传,但可能不如自定义实现的多线程下载灵活。 6. **文件读写操作** 在下载过程中,需要使用`RandomAccessFile`进行文件的追加写入,...
相关推荐
本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程,提高效率,并确保应用的响应性。 一、多线程基础 多线程是并发执行多个任务的能力,它允许应用程序同时处理多个任务,提高...
综上所述,"Android多线程下载文件"是一个涉及多方面技术的复杂任务,包括多线程编程、数据库操作、文件I/O、错误处理等。通过合理的设计和实现,我们可以创建一个高效、可靠的下载系统,为用户提供无缝的下载体验。
总之,这个Android多线程断点续传下载器项目涵盖了Android开发中的许多关键知识点,包括多线程编程、文件操作、网络请求、服务、数据持久化以及用户界面更新等,对于提升Android开发技能具有很高的实践价值。...
通过以上步骤,我们可以实现一个功能完善的Android多线程下载器,它支持暂停、断点续传,并能够根据用户需求进行定制。在项目实践中,务必注意线程同步和数据一致性,以保证下载的正确性。 最后,提供的...
总结,Android多线程下载是提升用户体验的重要手段,通过合理地划分任务、并发执行、同步合并,以及断点续传,可以有效地提高下载效率,减少用户等待时间。`demo.apk`是一个很好的实践案例,值得开发者深入研究。
在Android开发中,多线程断点下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并确保下载的连续性。这里我们将深入探讨这一主题,包括其原理、实现方式以及如何更新ListView...
在Android应用开发中,...总的来说,Android多线程下载结合断点续传技术,能够优化用户体验,提高下载效率。实际开发时,需要根据项目需求选择合适的实现方式,同时注意线程安全和资源管理,以确保程序的稳定性和性能。
通过以上步骤,我们可以构建一个功能完善的Android多线程断点下载应用,结合ListView展示下载任务,提供良好的用户交互体验。在实际开发中,还需要考虑各种边缘情况,进行充分的测试,以确保系统的稳定性和可靠性。
在Android开发中,多线程技术常常用于提升应用程序的性能,特别是在处理耗时操作,如文件下载时。这个"多线程分别下载文件"的Demo是针对在ListView或GridView控件中实现的一项功能,允许用户选择多个文件进行并行...
在Android开发中,多线程、断点续传和同时下载多个大文件是优化用户体验和提高应用程序性能的关键技术。下面将详细阐述这些知识点,并提供如何实现的指导。 **多线程** 多线程是Android应用中处理耗时操作的重要...
总之,Android多线程下载涉及到了Android线程模型、并发控制、文件操作等多个方面,需要开发者有扎实的基础知识和实践经验。通过合理利用多线程,不仅可以提升应用性能,还能提高用户满意度。在实际开发中,要根据...
综上所述,这个"android 多线程下载源代码"涵盖了Android并发编程、网络通信、文件操作等多个重要知识点,对于提升Android开发者处理大文件下载的能力非常有帮助。通过深入学习和实践,开发者可以更好地理解和掌握...
在Android平台上,多线程下载机制是提升应用性能和用户体验的关键技术之一,特别是在处理大文件如应用程序、视频或音频资源的下载场景中。通过利用多线程,我们可以将一个大文件分割成多个小部分,然后同时启动多个...
总的来说,实现Android多线程下载涉及网络请求、线程管理、文件操作、数据同步等多个方面。开发者需要熟悉Android的并发编程模型,了解网络编程的基础知识,并掌握文件I/O的操作。通过这样的实践,不仅可以提高应用...
综上所述,Android多线程断点续传下载涉及到网络请求、多线程管理、文件操作、错误处理等多个方面,是实现高效、稳定下载功能的关键技术。在实际开发中,可以参考开源库如`Volley`、`OkHttp`、`DownloadManager`等,...
本示例"android 多线程 下载 更新 ui 例子"旨在教你如何在Android环境中使用多线程进行文件下载,并实时更新UI来显示下载进度。 在Android主线程中,我们不能执行长时间运行的任务,因为这会导致应用程序无响应...
在Android开发中,文件下载是一项常见的任务,尤其是对于大型应用或者资源更新,多线程下载技术则显得尤为重要。本文将详细解析如何在Android环境中实现文件的多线程下载,包括自定义线程数、断点续传以及下载任务的...
在Android开发中,多线程断点续传...总之,Android多线程断点续传下载技术是提高用户体验的重要手段,涉及到了网络编程、多线程、文件操作、线程通信等多个技术领域,需要开发者具备扎实的基础和良好的问题解决能力。
Android提供了一个系统级别的`DownloadManager`服务,它可以处理文件的断点续传,但可能不如自定义实现的多线程下载灵活。 6. **文件读写操作** 在下载过程中,需要使用`RandomAccessFile`进行文件的追加写入,...