首页 > 解决方案 > 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);

    });

这是DownloadFileOpenStream功能

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);
    }
}

标签: c#androidxamarin.formspolly

解决方案


推荐阅读