1

我介绍了Thread.sleep一个Android应用程序的不同点。目的是让我有足够的时间在代码中的这些确切点上按下Home或按下。Back

当我在睡眠指令中按下这些按钮之一时,不会立即执行按钮操作,并且在某些情况下会执行客户端应用程序的附加指令。也就是说,线程正在休眠,我按下Home,客户端应用程序在返回主屏幕之前仍然处理几行代码(休眠后)。

为什么会这样?

.

为了更清楚地了解问题,请考虑以下代码块:

instruction 1;
instruction 2;
instruction 3;
Thread.sleep(8000);
instruction 4;
instruction 5;
instruction 6;
instruction 7;
...
instruction N;

HomeBack在睡眠时被按下,但在实际终止之前,应用程序可能仍会执行几条指令,比如最多 6 或 7 条指令。

[编辑] 我想补充一点,该应用程序包括几个 AsyncTask,并且我在它们的内部和外部都引入了 sleep。

4

1 回答 1

0

我认为你的问题是你Thread.sleep()在主线程上运行。这是您不想在 Android 或 Java(或任何其他语言)中做的事情。

在 Android 中,主线程只能用于手动设置 UI 元素。在以下情况下,Android 会自动将您的代码放在主线程上:

  1. 应用程序正在启动(onCreate(...)方法)
  2. 应用程序收到事件回调 ( onTouch(...), onKey(...))
  3. 您创建一个新活动(onCreate(...)新活动)

在以下情况下,您应该手动在主线程上放置一个代码块:

  1. 您正在修改 UI
  2. 您正在手动执行事件回调(调用onClickListener.onClick(...)

还有更多情况,但这些是最常见的。你需要做的是:

Runnable run = new Runnable()
{
    try
    {
        Thread.sleep(...); // <- your code goes here

    }catch(Exception e) {e.printStackTrace();} // just in case of interruption
}

Thread thread = new Thread(run);
thread.start();

这样,当用户想要逃离您的应用程序时,主线程就不会忙碌。您也应该避免在主线程上执行冗长的复杂操作,因为它可能会导致您的应用程序由于对 UI 的重新保护而变得“滞后”。

另请参阅:活动 | Android 开发者:runOnUiThread

^^ 那是您可以用来更改 UI 元素的方法。

于 2013-09-06T16:40:53.110 回答