我有一个应用程序,允许用户缓存数据以供离线使用。 我需要下载的数据主要是图像,但包括其他内容,如视频,文本文件和其他内容。的MP3。可下载的文件少至20个,或者超过300个或更多。在视频的情况下,文件的范围从几千字节到几兆米。
我尝试使用带有looper的服务和带有普通旧线程的服务,但即使我在服务上使用startForeground,它也不可避免地会因“超时执行服务”和大约10个文件后的ANR而被杀死或者我的Droid和我的不可思议。
当我得到ANR时,似乎用户系统的CPU使用率约为45-50%。服务会在一段时间后重新启动并继续,但我需要在大多数情况下优先使用下载。
以下是实际下载文件的代码,该文件在一个帖子中运行:
try {
URL request = new URL(entry.remotePath);
InputStream is = (InputStream) request.getContent();
FileOutputStream fos = new FileOutputStream(entry.localPath);
try {
byte[] buffer = new byte[4096];
int l;
while ((l = is.read(buffer)) != -1) {
fos.write(buffer, 0, l);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
is.close();
fos.flush();
fos.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我的问题是,有没有一种标准的方法可以做到这一点(像ACast这样的播客应用程序似乎通过服务下载了大量数据而没有问题),或者我是否采取了正确的方法,但我做错了导致过载到系统。我的服务线程是否应该在下载之间休眠,或者我可以做些什么来计量它以保持低CPU或让系统知道它仍在工作?
如果重要的话,我的目标是系统8及以上。