c# - ios monotouch 的 UIProgressView 跟踪下载状态

标签 c# ios xamarin.ios progress-bar threadpool

我一直在寻找如何在图片下载时更新 progressview。我目前的下载密码是

ThreadPool.QueueUserWorkItem(new WaitCallback(RetrieveImage),(object)cell);

private void RetrieveImage(object val)
{
CustomViewCell cell = (CustomViewCell)val;
int i = 0;
//lock(_imgDict){
//if ( !_imgDict.ContainsKey(cell.imageUrl) )
//{
     NSUrl nsUrl = new NSUrl(cell.imageUrl);
     NSData data = NSData.FromUrl(nsUrl);
     if (data != null) {
InvokeOnMainThread (() => {
    cell.imgImageView.Image = new UIImage (data);
    i++;
    cell.ProgressBar.Progress = (float)(i + 1) / 3; 
    });
    //_imgDict.Add (cell.imageUrl, data);
} 
}

所有这一切都是在图像顶部显示进度条,完成 75%。没有真正显示正在更新的进度?如何在图像仍在下载时使用当前线程更新进度条。我看到了其他示例,但无法真正理解它们。

编辑:

ThreadPool.QueueUserWorkItem(new WaitCallback(RetrieveImage),(object)cell); 

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
 using(var client = new WebClient())
 {
client.DownloadProgressChanged+= 
 delegate(object sender, DownloadProgressChangedEventArgs e)
    {
         if (e.TotalBytesToReceive != 0) {
        InvokeOnMainThread (() => {
        cell.PG.Progress = e.BytesReceived / 
                e.TotalBytesToReceive;
              });
             }
     };
client.DownloadDataCompleted += 
delegate(object sender, DownloadDataCompletedEventArgs e)
    {
      if(e.Result!=null)
          {
                NSData data = NSData.FromArray(e.Result);
           _imgDict.Add (cell.ImageUrl, data);
         InvokeOnMainThread (() => {
                  cell.PG.Hidden=true;
                  cell.imgImageView.Image =  UIImage.LoadFromData(data);
            });
     }
    else
    {
        InvokeOnMainThread (() => {
        cell.PG.Hidden=true;
                    cell.imgImageView.Image = UIImage.FromBundle("Images/retrydownload.png");
                    });
    }
 }; 
    client.DownloadDataAsync(new Uri(cell.ImageUrl));
}

现在有了这个更新后的代码,我在下载时看不到进度条

最佳答案

您将进度硬编码为 75%。 在您的代码中 i == 0,所以 (float)(i + 1)/3 = 1/3 = 0.75

NSData.FromUrl() 不支持简单的进度处理。如果你想坚持使用原生的东西,你将不得不继承 NSUrlConnection 并覆盖 DidReceiveData()

或者,我建议您改用 WebClient,这是下载内容的 .NET 方式:

var client = new WebClient();
client.DownloadProgressChanged += (args) =>
{
Console.WriteLine("Downloaded {0} of {1} bytes", args.BytesReceived, args.TotalBytesToReceive);
};

client.DownloadFileCompleted += (args) => Console.WriteLine("Download finished.");
client.DownloadFileAsync(new Uri("someurl"), "somelocalpath");

关于c# - ios monotouch 的 UIProgressView 跟踪下载状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464377/

相关文章:

c# - 如何使用NEST为ElasticSearch lib使用属性指定索引名称?

c# - 如何在不使用 C# 驱动程序指定过滤器的情况下替换 mongodb 中的对象?

iphone - Xcode 无法识别我的新配置文件

android - 在 iOS 中使用 gmail API 验证用户实际上是大学生的最佳方法?

ios - 使用 Objective-C 放大和缩小相机 View ?

c# - await CLGeocoder.GeocodeAddressAsync 从不返回

c# - 从 Socket AsyncCallback 访问 UI 线程

c# - 是否有适用于 Windows Core Audio 的 COM 类型库

c# - 无法使用 XFormsApplicationDelegate 初始化 iOS AppDelegate.cs

ios - 非泛型类型不能与类型参数一起使用 (Realm Xamarin)