当前位置: 首页 > 知识库问答 >
问题:

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

袁弘化
2023-03-14
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);

    }

共有1个答案

齐元章
2023-03-14

那么,如何更改后台代码,使其只每秒调用一次publishProgress

我以前为一个在通知中显示%的上传函数做过这样的操作,但想法完全相同。让您的AsyncTask跟踪下载的PercentDone内容,并且只有在PercentDone更改时才调用Publisprogress。这样,只有当%downloaded发生更改时,才会调用publishprogress,因此通知需要更新。这应该可以解决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);
    }
 类似资料:
  • 我正在尝试在数据库上注册一个项目(6小时或12小时)后的特定时间发送通知。当我只注册一个项目时,通知工作良好,但是,如果我在一段时间内注册了两个项目,第一个通知将被第二个覆盖。 我知道我必须将id添加到挂起的意图中,可能还需要将id添加到实际通知中,但是我对alarmManager类不是很熟悉,也不知道应该在哪里添加id。如何使这两个通知相互独立? NotificationHelper类: 我开始

  • 问题内容: 我在应用程序中使用了出色的模块。作为此过程的一部分,我使用命名视图来管理应用程序中的“动态子导航”。 考虑以下: 用户首次访问该应用程序时,系统会向他们显示人员列表。当他们单击某个人时,他们将被带到详细信息页面。很基本的东西。如果有帮助,这是标记… 但是,调用REST服务以获取人员列表,因此在查看人员时,用户可以导航同级元素。使用上述方法会导致模板和控制器重新呈现,因此每次单击后都会产

  • 我已经用UUID作为每个文件名的密钥将文件上传到s3 bucket,我要求将文件密钥作为存储的UUID,但当下载时,我需要将下载的文件名作为实际文件名,例如:foo.png aws S3-0E8221B9-9BF4-49D6-B0C0-D99E86F91F8E.png上存储的文件下载文件名应为:foo.bar 我尝试过设置Content-Disposition元数据,但在下载文件时仍然包含UUID

  • 我尝试添加多个csv文件。我已经按照下面的链接。如何在Python中合并200个csv文件 但我的价值观从 到 如何预防这种情况? 提前谢谢

  • 问题内容: 旋转屏幕时,WebView会重新加载整个页面。我无法使用此功能,因为我的某些内容包含动态/随机材料。当前,屏幕旋转时会从loadUrl()方法重新加载原始URL。 知道我的代码有什么问题吗? MainActivity.java AndroidManifest.xml 问题答案: 我认为主要问题是您调用了web.loadUrl(webURL); 当saveInstanceState!=

  • 问题内容: 朋友们,美好的一天! 首先,对不起我的英语。这是我的问题: 我是JSF(2.0)的新手,我正尝试使用BalusC算法从托管bean下载文件。功能正常运行,浏览器中出现“另存为…”对话框。但是我不知道如何在不重新加载/重定向视图的情况下返回文件下载错误消息(后备bean方法中的异常,DB错误等)。 我在视图上的隐藏按钮: 我的托管bean(我可以使用哪个范围?我尝试过请求并查看范围)方法