我有一项服务可以在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会正常响应...
答案 0 :(得分:5)
AsyncTask旨在成为围绕
Thread
和Handler
的帮助程序类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒。)如果需要保持线程长时间运行,强烈建议您使用{提供的各种API。 {1}}例如Executor
,ThreadPoolExecutor
和FutureTask
。
因此,请考虑在服务中使用java.util.concurrent
。或者看一下IntentService
,它在一个单独的工作线程上运行,不会影响UI(避免NetworkOnMainThreadException
)。关于Thread
的注意事项:
所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。
UI是另一部分。如果你能提供你的方法,我想也许我可以提供帮助。 例如,my app中的“下载”扩展程序工作正常至今: - )