如何阻止此应用程序显示为没有响应

本文关键字:响应 显示 何阻止 应用程序 | 更新日期: 2023-09-27 17:59:22

我起草了一个简单的Android应用程序,它在一定的秒数(在本例中为100)内循环进行数学计算。然而,当我运行应用程序时,因为在循环之后程序中什么都不做,当它写入完成的计算数时,它显示为没有响应。有什么简单的方法可以解决这个问题吗?

如何阻止此应用程序显示为没有响应

必须在另一个线程中执行,这样UI就不会阻塞,也不会变得不负责任。

同时,您可以使用进度对话框显示活动指示器。并且当处理完成时隐藏它。

小心交叉线程中的UI操作。

使用异步等待并在任务中运行数学。如果你从一个活动开始任务,如果由于某种原因活动被破坏,不要忘记取消它。

以下是一个应该让你开始的快速示例(备选方案已被注释):

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