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