MonoTouch在背景中加载图像

时间:2012-10-15 02:18:51

标签: ios multithreading c#-4.0 xamarin.ios

我在尝试加载图像并使用System.Threading.Task

显示它时遇到问题

我的代码如下

    Task DownloadTask { get; set; }

    public string Instrument { get; set; }

    public PriceChartViewController(string Instrument) {
        this.Instrument = Instrument;
        DownloadTask = Task.Factory.StartNew(() => { });
    }


    private void LoadChart(ChartType chartType) {
        NSData data = new NSData();

        DownloadTask = DownloadTask.ContinueWith(prevTask => {
            try {
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;

                NSUrl nsUrl = new NSUrl(chartType.Uri(Instrument));
                data = NSData.FromUrl(nsUrl);
            }
            finally {
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
            }
        });

        DownloadTask = DownloadTask.ContinueWith(t => {
            UIImage image = new UIImage(data);

            chartImageView = new UIImageView(image);
            chartImageView.ContentScaleFactor = 2f;

            View.AddSubview(chartImageView);

            this.Title = chartType.Title;
        }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
    }

第二次继续似乎没有被调用?

最初,我的代码在没有后台处理的情况下看起来如下所示,并且完美运行。

    private void oldLoadChart(ChartType chartType) {

        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;

        NSUrl nsUrl = new NSUrl(chartType.Uri(Instrument));
        NSData data = NSData.FromUrl(nsUrl);
        UIImage image = new UIImage(data);

        chartImageView = new UIImageView(image);
        chartImageView.ContentScaleFactor = 2f;

        View.AddSubview(chartImageView);

        this.Title = chartType.Title;

        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
    }

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:2)

线程的第一部分崩溃了,这就是为什么它永远不会到达第二部分: 你在呼叫UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;  来自非UI线程。设置网络活动指示符是UI操作,并且只能在主线程上执行。你必须把它包装在InvokeOnMainThread()中。 如果你添加一个try-catch,你会看到异常。

答案 1 :(得分:0)

catch之前添加finally。也许你只是有一个例外,所以工作流程不再进一步。