下载文件会导致UI口吃

时间:2013-03-11 21:57:55

标签: java android multithreading

我有一项服务可以在AysncTask的{​​{1}}方法中下载大文件:

doInBackground()

在执行此操作时(文件正在下载),滚动浏览data = new byte[8192]; output = new FileOutputStream(fileLoc); connection = (HttpURLConnection) new URL(currUrl).openConnection(); input = new BufferedInputStream(connection.getInputStream()); while ((count = input.read(data)) != -1) { output.write(data, 0, count); } 可能会有点不稳定到非常不连贯。

我尝试为下载服务创建一个新进程,更改ListView线程的优先级,在doInBackground()循环期间暂停任意数毫秒并且我已针对内存使用进行了优化

我陷入困境,无法弄清楚如何在下载过程中使用户界面不会断断续续。在下载不进行时,UI会正常响应...

1 个答案:

答案 0 :(得分:5)

documentation说:

  

AsyncTask旨在成为围绕ThreadHandler的帮助程序类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒。)如果需要保持线程长时间运行,强烈建议您使用{提供的各种API。 {1}}例如ExecutorThreadPoolExecutorFutureTask

因此,请考虑在服务中使用java.util.concurrent。或者看一下IntentService,它在一个单独的工作线程上运行,不会影响UI(避免NetworkOnMainThreadException)。关于Thread的注意事项:

  

所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。

UI是另一部分。如果你能提供你的方法,我想也许我可以提供帮助。 例如,my app中的“下载”扩展程序工作正常至今: - )