5

我有一个在AysncTask'sdoInBackground()方法中下载大文件的服务:

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);
}

在执行此操作时(正在下载文件),滚动 aListView可能会从有点不稳定到非常不稳定。

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

我被卡住了,无法弄清楚如何在下载过程中让 UI 不卡顿。下载未进行时,用户界面正常响应...

4

1 回答 1

5

文档说:

AsyncTask 被设计为一个辅助类ThreadHandler并且不构成通用线程框架。AsyncTasks 应该理想地用于短操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用java.util.concurrentpacakge 提供的各种 API,例如Executor,ThreadPoolExecutorFutureTask.

因此,请考虑Thread在您的服务内部使用。或者看一下IntentService,它在单独的工作线程上运行并且不会影响 UI(避免使用NetworkOnMainThreadException)。注意事项IntentService

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

UI 是另一部分。如果你能提供你的方法,我想也许我可以提供帮助。例如,我的应用程序中的下载扩展程序到目前为止运行良好 :-)

于 2013-03-11T22:53:55.557 回答