Mike U
Mike U

Reputation: 3061

MonoTouch Load image in background

I am having a problem trying to load an image and display it using System.Threading.Task

My Code is as follows

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

The second Continue with does not seem to be being called?

Initially my code looked like the following without the background processing and it worked perfectly.

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

Does anyone know what I am doing wrong?

Upvotes: 1

Views: 475

Answers (2)

Krumelur
Krumelur

Reputation: 33048

Your first part of the thread is crashing, that's why it is never getting to the second: You are calling UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true; from a non-UI thread. Setting the network activity indicator is a UI operation and may only be executed on the main thread. You'll have to wrap it in InvokeOnMainThread(). If you add a try-catch, you'll see the exception.

Upvotes: 2

folex
folex

Reputation: 5287

Add catch before finally. Maybe you just have an exception so workflow doesn't go any further.

Upvotes: 0

Related Questions