c# - Xamarin android 下载在第二次尝试后挂起
问题描述
我真的在为下面的代码苦苦挣扎。目前正在开发 Xamarin Android 应用程序。我正在从网络服务器下载文件,但如果网络中断,我想重试几次下载。但在第二次抛出异常后,它不再继续下载。第一次它就像一个魅力。
我也在不使用 Polly 的情况下尝试了它,并在内置延迟的情况下递归地尝试了它。但没有运气。抛出异常后,下载不再继续。:-( 知道是什么原因造成的吗?Android 9.0 内置的东西?
await Policy
.Handle<NetworkOnMainThreadException>()
.Or<Java.Net.UnknownHostException>()
.Or<SSLException>()
.WaitAndRetryAsync(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10)
})
.ExecuteAsync(async () =>
{
totalRead = await DownloadFile(url, progress, totalRead, token);
});
这是DownloadFile
和OpenStream
功能
private async Task<long> DownloadFile(string url, IProgress<double> progress, long totalRead, CancellationToken token)
{
// Step 1 : Get call using HttpClient
var response = await _client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token);
if (!response.IsSuccessStatusCode)
{
throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode));
}
// Step 2 : Filename
var fileName = url.Split('/').Last();
var buffer = new byte[bufferSize];
// Step 3 : Get total of data
var totalData = response.Content.Headers.ContentLength.GetValueOrDefault(-1L);
// Step 4 : Get the full path
var filePath = Path.Combine(_fileService.GetStorageFolderPath(), fileName);
// Step 5 : Download data
using (var fileStream = OpenStream(filePath, totalRead))
{
using (var inputStream = await response.Content.ReadAsStreamAsync())
{
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
totalRead += bytesRead;
// Write data on disk.
await fileStream.WriteAsync(buffer, 0, bytesRead);
progress.Report((totalRead * 1d) / (totalData * 1d) * 100);
}
progress.Report(0);
}
}
return totalRead;
}
private Stream OpenStream(string path, long totalRead)
{
if (totalRead > 0)
{
return new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize);
}
else
{
return new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize);
}
}
解决方案
推荐阅读
- reactjs - 在新的反应项目中运行 npm start 命令时出现控制台错误
- node.js - 在所有其他脚本之前运行 NPM 脚本
- javascript - 如何从 JS 中的实例化中获取类?
- build - ./toolchain.py:找不到命令(kivy)
- c# - 使用 WPF .Net.Core 从 windows 环境为 mac os 制作多平台应用程序
- javascript - 如何从输入字段编辑表数据的值
- php - 为什么这个 PHP 递归函数不起作用
- python - 在 Pandas 数据框中对行进行分组,应用自定义函数并将结果作为行存储在新数据框中
- python-3.x - 气流 - 在初始化期间修补函数
- rust - 使 struct 的默认值在 rust 中生效