如何阻止此应用程序显示为无响应?

时间:2014-04-22 22:52:27

标签: c# android xamarin

我有一个简单的Android应用程序,我在循环中进行数学计算一定的秒数(在本例中为100)。但是,当我运行应用程序时,因为直到循环之后程序中没有任何操作,当它写入完成的计算次数时,它显示为没有响应。有没有一种简单的方法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

你必须在另一个线程中执行它,这样UI就不会阻塞而不会变得无法响应。

同时,您可以使用进度对话框显示活动指示器。当过程完成后隐藏它。

请注意跨线程中的UI操作。

答案 1 :(得分:0)

使用async等待并在任务中运行数学运算。如果您从活动中启动任务,请不要忘记取消它,如果由于某种原因活动被破坏。

这是一个应该让你入门的快速示例(备选方案已注释掉):

[Activity (Label = "AsyncSample", MainLauncher = true)]
public class MainActivity : Activity
{
    private CancellationTokenSource cancellation;
    private Button button;
    private Task task;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate (bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        // Get our button from the layout resource,
        // and attach an event to it
        button = FindViewById<Button> (Resource.Id.myButton);

        button.Enabled = false;
        this.cancellation = new CancellationTokenSource ();
        this.task = RunTask(this.cancellation.Token, new Progress<int> (a => this.button.Text = string.Format ("Progress {0}", a)));
    }

    protected override void OnDestroy()
    {
        this.cancellation.Cancel ();
        base.OnDestroy ();
    }

//        protected override void OnStop()
//        {
//            base.OnStop ();
//            this.cancellation.Cancel ();
//        }
//
//        protected override async void OnStart()
//        {
//            base.OnStart ();
//
//            this.cancellation = new CancellationTokenSource ();
//            await RunTask (this.cancellation.Token, new Progress<int> (a => this.button.Text = string.Format ("Progress {0}", a)));
//        }

    private Task RunTask(CancellationToken cancelToken, IProgress<int> progress)
    {
        return Task.Factory.StartNew(()=>
        {
            for (var n = 0; n < 100 && !cancelToken.IsCancellationRequested;)
            {
//                    await Task.Delay (1000);
                Thread.Sleep(1000);
                progress.Report (++n);
            }
        });
    }
}