如何阻止此应用程序显示为没有响应
本文关键字:响应 显示 何阻止 应用程序 | 更新日期: 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);
}
});
}
}