如何防止长时间运行冻结

时间:2016-07-12 21:02:13

标签: java android

在VB.NET中我可以执行如下代码:

Sub Compute(sender As Object, e As EventArgs) Handle btnCompute.Click
 For i = 0 to IterationLimit
  ' Do something
  Applicaton.DoEvents()
 Next
End Sub

一次迭代运行大约50 ms,但整个方法运行 - 大约5分钟。 " Appliction.DoEvents()"允许系统正确刷新表单并允许用户执行操作(按取消按钮,笔划热键等)。我怎么能用java for Android?

2 个答案:

答案 0 :(得分:2)

如果您希望UI和其他组件在运行时保持响应,则希望在线程中运行代码。

有关如何从线程运行方法的一个非常简单明了的示例,请参阅此文档:https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

基本上你想扩展Thread类:

public class MyThread extends Thread {
    public void run() {
        //do some background work
        //put whatever you want your thread to do here
    }
}

并称之为:

new MyThread().start();

答案 1 :(得分:2)

对于可能需要一段时间才能处理的较长操作,有几种方法可以执行此操作:

  • 使用service(IntentService - 这是Service的子类应该没问题)。当服务在后台完成长时间操作时,您始终可以获得结果。
  • 使用AsyncTask - 这也在后台运行,虽然建议用于较短的操作,如准备UI元素,从数据库,文件等中读取数据,但您可以做一些工作以避免冻结UI线程。
  • 创建一个Thread子类也应该正常工作,正如@nhouser9在答案中提到的那样。

目标是避免过度使用UI线程并对用户体验产生负面影响。

我希望这会有所帮助。