下载文件时更新通知时如何防止 UI 滞后?

2024-04-06

我目前正在使用AsyncTask要在我的应用程序后台下载大文件,当前下载进度显示为ProgressDialog这是通过更新onProgressUpdate如下:

protected String doInBackground(String... sUrl) {
        try {
            String destName = sUrl[1];
            file_Delete(destName); // Just to make sure!

            URL url = new URL(sUrl[0]);
            URLConnection connection = url.openConnection();
            connection.connect();
            int fileLength = connection.getContentLength();

            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(destName);

            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();

        } catch (Exception e) {
            Log.e(TAG, NAME + ": Error downloading file! " + e.getMessage());
            return e.getMessage();
        }

        return null;
    }

@Override protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        DownloadImage.mProgressDialog.setProgress(progress[0]);


    }

这工作正常,但是我现在想在通知栏中使用通知,因此要跟踪下载情况(因为文件可能相当大,并且用户希望从应用程序外部跟踪)。

我已经尝试了下面的代码,但是 UI 开始严重滞后,我可以看到它是由于publishProgress经常被调用,那么我该如何更改后台代码来调用publishProgress仅每秒

@Override protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        DownloadImage.mProgressDialog.setProgress(progress[0]);

        DownloadImage.myNotification = new NotificationCompat.Builder(c)
        .setContentTitle("Downloading SlapOS")
        .setContentText("Download is " + progress[0] + "% done")
        .setTicker("Downloading...")
        .setOngoing(true)
        .setWhen(System.currentTimeMillis())
        .setProgress(100, progress[0], false)
        .setSmallIcon(R.drawable.icon)
        .build();

        DownloadImage.notificationManager.notify(1, DownloadImage.myNotification);

    }

那么我怎样才能改变后台代码以每秒调用一次publishProgress

我之前已经为上传功能做过这个,该功能显示了 %Notification,但同样的想法。有你的AsyncTask跟踪什么percentDone下载的是,并且ONLY call publishProgress when percentDone变化。这样,您只需调用publishProgress当下载的百分比发生变化时,Notification因此需要更新。这应该可以解决 UI 延迟问题。

我正在将其写为我建议的实现,听起来 OP 已经开始工作了。但也许这会在未来帮助其他人:

    byte data[] = new byte[1024];
    long total = 0;
    int count, latestPercentDone;
    int percentDone = -1;
    while ((count = input.read(data)) != -1) {
        total += count;
        latestPercentDone = (int) Math.round(total / fileLength * 100.0);
        if (percentDone != latestPercentDone) {
            percentDone = latestPercentDone;
            publishProgress(percentDone);
        }
        output.write(data, 0, count);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

下载文件时更新通知时如何防止 UI 滞后? 的相关文章

随机推荐

  • 404 找不到页面 codeigniter url

    我是一个使用 codeigniter 的初学者 我正在使用以下网址 http localhost ci index php shopcart http localhost ci index php shopcart 访问控制器 我收到错误
  • 验证网站所有权的简化方法(使用 JavaScript?)

    我有一个 Rails 应用程序 它要求用户在提交来自该网站的链接之前验证他们是否拥有该网站 我已经实现了一个网站验证系统 由于给出的答案 该系统可以正常工作我几个月前提出的一个问题 https stackoverflow com quest
  • Json 到 C# 对象处理动态属性

    我正在尝试在 c 对象中实现 json 结构 并且我正在尝试了解如何根据类型使用正确的对象 例如 public class RootObject public string name get set public Content conte
  • 有什么方法可以绘制印度地图吗?

    我正在尝试使用plotly 绘制印度地图 但无法找到方法来做到这一点 下面是我在美国尝试过的代码 import pandas as pd df sample pd read csv https raw githubusercontent c
  • 软件中显示过多“皮肤”检测

    我正在构建一个 ASP NET 网站 用户可以在其中上传自己的照片 每天可能会上传数千张照片 我的老板问过几次的一件事是 是否有任何方法可以检测到是否有任何照片显示太多 皮肤 并在编辑做出最终决定之前自动将这些照片标记为 仅限成人 最好的选
  • 如何确保 div 和同位素没有空白

    我正在尝试创建一个网格布局http www gablabelle com http www gablabelle com 我有多个漂浮着同位素的 div 我想知道为什么有一些空白空间以及为什么漂浮的 div 没有填充间隙 与这里同样的问题
  • CSS 最小宽度 div 不强制其容器达到预期的正确尺寸

    我有一个需要最小宽度的 DIV 我无法使用 CSSmin width因为它不是跨浏览器的 我创建了一个具有设定宽度的内部 div 当浏览器小于这个内部 div 时 我会按预期得到一个滚动条 问题是外部 div 不断缩小 小于内部 div S
  • 如何从 github 手动或离线安装 R 包

    我尝试从 github 下载 tsdyn 包 它尚未在 cran 上更新 但我的代理阻止我连接到 github library devtools install github MatthieuStigler tsDyn ref Dev94
  • 在 React 中将函数向下传递给子组件

    我试图将一个函数传递给 React 中的子组件 如果我将该函数放在 ES6 类中 我就可以访问this props dispatch 但无权访问mapStateToProps 相反 当我在 ES6 类之外定义函数时 我似乎可以访问该函数 但
  • 如何使用office.js获取office应用程序版本值

    Office 应用程序版本可以在清单文件中提及 如下所示
  • C++11 中一个表达式中同一变量的双重赋值

    C 11 标准 http www open std org jtc1 sc22 wg21 docs papers 2012 n3337 pdf 5 17 expr ass 指出 在所有情况下 分配都是在值计算之后排序的 右操作数和左操作数的
  • 冰滑拼图寻路

    我对这个有点模糊的标题表示歉意 我不确定你会如何称呼这个谜题 我正在制作一种路径查找方法来查找移动次数最少的路线 而不是行驶的距离 游戏规则很简单 你必须从橙色方块移动到绿色方块 但你只能沿直线移动 并且不能停止沿该方向移动 直到碰到边界
  • 调整大小的 NSImageView 不重绘

    我有一个 NSImageView 它从应用程序包加载图像 它的设置如下 coverImage image NSImage imageNamed themeSignEnd png coverImage imageScaling NSImage
  • 内置 open 函数中模式 a、a+、w、w+ 和 r+ 之间的区别?

    在python内置的open http docs python org library functions html open功能 模式之间的确切区别是什么w a w a and r 特别是 文档暗示所有这些都将允许写入文件 并表示它打开文
  • Guice:如何基于(动态 Web 属性)更改运行时注入

    以下是我面临的问题的近似值 认为我们有一个带有一些规则的密码验证器 public interface RuleChecker Checks for a password strenght returns 10 for strong or 0
  • 解码 Torrent 追踪器抓取的 Torrent 哈希值?

    我在用BEncoded PHP 库 http proger i forge net BEncoded E2 80 93 handling torrent files in PHP 7Tn解码来自 Bittorrent 跟踪器的编码响应 Tr
  • 考虑行之间的“差异”对行进行分组

    我有一个表 其中包含开始时间 在示例中使用数字以保持简单 和事件的持续时间 我想确定 块 及其开始时间和结束时间 每当前一行 按开始时间排序 的结束时间 开始时间 持续时间 与当前行的开始时间之间的差值为 gt 5 一个新的 块 应该开始
  • SearchView 过滤和设置建议

    我对使用很陌生SearchView 我需要一个功能 我有一个ActionBar为此我有Search 当我点击 搜索 时 建议应该显示在List在搜索字段下方 到目前为止我所做的 在menu xml中添加搜索并将代码写入onCreateOpt
  • 尽管满足全局要求,但使用 pip 在本地安装软件包

    我正在尝试使用 pip 在本地安装包 local 问题是该软件包 在旧版本中 已经在系统上全局可用 即使全局 python 包目录是not in my PYTHONPATH pip仍然拒绝安装 认为满足了包要求 这与此处描述的问题类似 但我
  • 下载文件时更新通知时如何防止 UI 滞后?

    我目前正在使用AsyncTask要在我的应用程序后台下载大文件 当前下载进度显示为ProgressDialog这是通过更新onProgressUpdate如下 protected String doInBackground String s