【问题标题】:Downloading to a temp folder then overwriting original files - speed issues?下载到临时文件夹然后覆盖原始文件 - 速度问题?
【发布时间】:2013-12-09 18:12:43
【问题描述】:

我有一个应用程序,它可以下载单个 html 文件和各种图像,有时还可以下载 mp4 视频。

初次下载后,后台服务每 15 分钟重复下载一次。

该服务会检查是否有任何新文件以及是否有任何文件已被修改(在这种情况下,通常是 html 文件将被修改并会下载一些新图像)

我有一个显示 html 文件的 webview,在后台服务成功下载一些新资产后,webview 会刷新。

但是,在下载服务时,应用程序将使用文件,并在 web 视图中显示它们(视频由 videoview 处理,使用 javascript 桥接器,翻转两个视图)

所以,我的问题。

在看到当前应用程序可能存在的一些问题后,我希望后台服务将资产下载到临时文件夹,而不是使用的主文件夹(我使用在下载中创建的子文件夹)

然后,一旦下载完成,我会“停止” webview,将文件从“tmp”复制到真实文件夹,然后重新启动 webview。

逻辑听起来不错,但我担心速度。要复制的文件的重量可能达到 100mb(可能更多,希望更少,由于带宽问题 obv。)那么 Android 复制这些文件的速度有多快?

理想情况下,转换需要在几秒钟内完成。

任何人都可以就此提出建议吗?

是否有更好的方法来处理这种情况?

【问题讨论】:

    标签: android webview android-webview android-video-player


    【解决方案1】:

    将临时目录放在主数据目录下面,然后使用原子rename(2) 调用将新文件移动到位。 (这仅在源目录和目标目录位于同一文件系统中时自动工作,因此建议放置临时文件。您也可以将它们作为 FILENAME.EXTENSION.new 放入 same 目录,然后重命名它们。像往常一样,在设计文件名时要小心临时文件竞争;如果可以的话,使用像 mkstemp(3) 这样的东西来创建它们。)

    【讨论】:

    • 我正在用 Java 为 Android 编写这个。这仍然适用吗?
    • 如果您不能调用本机函数,请使用 Java™ 等效项,例如通过使用 Android NDK。它仍然适用,因为这是系统调用级别,即直接与 Linux 内核相关,独立于中间的操作系统层(仿生/Android 与常规 libc)。
    【解决方案2】:

    您能否将 WebView 指向“临时”目录,然后在后台删除原始目录? (那么你以后总是使用“临时”目录)。

    【讨论】:

    • 并非如此。我的意思是,我可以,但这不是我需要的工作方式。 webview 需要查看我创建的主文件夹,而不是其他任何地方。可悲的是,更改使用的目录只是浪费时间。我正在实现逻辑来下载添加了 .tmp 的文件,然后重命名并刷新 webview :)
    • 如果您担心速度,那么在刷新 WebView 之前要在磁盘上操作(例如重命名、移动)文件的任何操作都将成为闪存速度非常慢的移动设备上的巨大瓶颈。如果您使用了刚刚下载的文件,然后在后台线程中删除了旧文件,那么您最好立即开始。
    • 我没有使用 Flash... 到目前为止,我的初始测试表明重命名方法非常快。
    • 我的意思是闪存盘,而不是浏览器插件 ;-) 它在您使用的设备上可能“很快”,但在不同的 Android 设备上可能会有很大差异,具体取决于您的磁盘操作正在执行,这些操作有多大以及设备中驱动器的质量……或者可能不会;有很多变量需要考虑。但我认为这就是您的问题的重点,对 - 了解可能导致此操作缓慢的原因,以及可能更快的替代方法。
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2015-08-06
    • 2020-01-25
    • 1970-01-01
    • 2012-05-15
    • 2018-05-19
    • 2020-09-01
    相关资源
    最近更新 更多