我一直在寻找如何在图片下载时更新进度视图。我目前的下载代码是
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));
}
现在使用此更新的代码我在下载时看不到进度条
答案 0 :(得分:1)
您正在将进度硬编码为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");