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
我以前为一个在通知
中显示%的上传函数做过这样的操作,但想法完全相同。让您的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类: 我开始
我已经用UUID作为每个文件名的密钥将文件上传到s3 bucket,我要求将文件密钥作为存储的UUID,但当下载时,我需要将下载的文件名作为实际文件名,例如:foo.png aws S3-0E8221B9-9BF4-49D6-B0C0-D99E86F91F8E.png上存储的文件下载文件名应为:foo.bar 我尝试过设置Content-Disposition元数据,但在下载文件时仍然包含UUID
问题内容: 我在应用程序中使用了出色的模块。作为此过程的一部分,我使用命名视图来管理应用程序中的“动态子导航”。 考虑以下: 用户首次访问该应用程序时,系统会向他们显示人员列表。当他们单击某个人时,他们将被带到详细信息页面。很基本的东西。如果有帮助,这是标记… 但是,调用REST服务以获取人员列表,因此在查看人员时,用户可以导航同级元素。使用上述方法会导致模板和控制器重新呈现,因此每次单击后都会产
我尝试添加多个csv文件。我已经按照下面的链接。如何在Python中合并200个csv文件 但我的价值观从 到 如何预防这种情况? 提前谢谢
问题内容: 旋转屏幕时,WebView会重新加载整个页面。我无法使用此功能,因为我的某些内容包含动态/随机材料。当前,屏幕旋转时会从loadUrl()方法重新加载原始URL。 知道我的代码有什么问题吗? MainActivity.java AndroidManifest.xml 问题答案: 我认为主要问题是您调用了web.loadUrl(webURL); 当saveInstanceState!=
问题内容: 朋友们,美好的一天! 首先,对不起我的英语。这是我的问题: 我是JSF(2.0)的新手,我正尝试使用BalusC算法从托管bean下载文件。功能正常运行,浏览器中出现“另存为…”对话框。但是我不知道如何在不重新加载/重定向视图的情况下返回文件下载错误消息(后备bean方法中的异常,DB错误等)。 我在视图上的隐藏按钮: 我的托管bean(我可以使用哪个范围?我尝试过请求并查看范围)方法