0

编辑:对不起 - 现在我已经更好地理解了这个问题,我认为我的问题出在其他地方

我有 2 个异步请求。

第一个是这样的:

public void DownloadWebData(Uri apiUrl)
{
    WebClient client = new WebClient();
    client.DownloadDataCompleted += DownloadDataCompleted;
    client.DownloadDataAsync(apiUrl);
}

public void DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    string result = System.Text.Encoding.UTF8.GetString (e.Result);
    Uri downloadLink = (GetUri(result));
}

基本上,它向远程网络服务器发出一个简单的基于 url 的 API 请求,该请求通过 http 返回一些基本的文本数据。GetUri() 只是解析该数据以从数据中提取地址以供下载图像。

然后我在 monotouch.dialog 中使用 imageLoader 来下载图像。所有代码都在同一个类中。

编辑:添加了 imageLoader 代码(我留下了 Console 行,因为它们可以很好地用作评论)。

public void downloadImage (Uri imageUri) 
{
    var tmp_img = ImageLoader.DefaultRequestImage (imageUri, this);

    if (tmp_img != null)
    {
        adView.Image = tmp_img;
        Console.WriteLine ("Image already cached, displaying");
    }
    else
    {
        adView.Image = UIImage.FromFile ("Images/downloading.jpg");
        Console.WriteLine ("Image not cached.  Using placeholder.");
    }
}

public void UpdatedImage (System.Uri uri) 
{
    adView.Image = ImageLoader.DefaultRequestImage(uri, this);
}
4

3 回答 3

0

你错过了检查是否e.Result真的包含一些东西。下载也可能失败并且e.Resultnull. 为您的代码添加一些基本的错误处理。

于 2013-07-14T08:43:48.350 回答
0

如果您在 for 循环中使用 DownloadWebData,最好为 DownloadDataCompleted 事件生成单独的函数。您可以在 DownloadWebData() 中使用匿名函数。

client.DownloadDataCompleted +=(s,e)=>{
    string result = System.Text.Encoding.UTF8.GetString (e.Result);
    Uri downloadLink = (GetUri(result));
};
于 2013-07-14T09:15:10.297 回答
0

在意识到我问错了问题后,我终于在这里弄清楚了:

在异步图像下载后将控制权交还给主 UI 线程以更新 UI

于 2013-07-14T10:00:23.867 回答