在Android上的后台下载大量文件

时间:2011-05-03 21:54:32

标签: android

我有一个应用程序,允许用户缓存数据以供离线使用。 我需要下载的数据主要是图像,但包括其他内容,如视频,文本文件和其他内容。的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及以上。

1 个答案:

答案 0 :(得分:1)

查看AsyncTask。这样您就可以在显示UI时显示长时间运行的进程。

另外,您可以在Android线程here.

上找到好的/官方教程