Android 使主线程休眠

Android 使主线程休眠,android,multithreading,android-ui,thread-sleep,Android,Multithreading,Android Ui,Thread Sleep,我正在设计一款android应用程序,它要求我让主线程休眠一段时间,我知道这会使应用程序冻结,UI将不是可编辑的材料,但是,这是我在应用程序中需要的,我可以接受,问题是,当用户在主线程处于睡眠状态时点击UI时,应用程序崩溃,并向我提供以下日志: 06-15 13:10:57.620: E/ActivityManager(542): ANR in com.example.myapp (com.example.myapp/.Login) 06-15 13:10:57.620: E/ActivityM

我正在设计一款android应用程序,它要求我让
主线程
休眠一段时间,我知道这会使应用程序冻结,UI将不是可编辑的材料,但是,这是我在应用程序中需要的,我可以接受,问题是,当用户
主线程
处于睡眠状态时点击UI时,应用程序崩溃,并向我提供以下
日志

06-15 13:10:57.620: E/ActivityManager(542): ANR in com.example.myapp (com.example.myapp/.Login)
06-15 13:10:57.620: E/ActivityManager(542): PID: 1339
06-15 13:10:57.620: E/ActivityManager(542): Reason: Input dispatching timed out (Waiting because the touched window has not finished processing the input events that were previously delivered to it.)
06-15 13:10:57.620: E/ActivityManager(542): Load: 0.67 / 0.36 / 0.14
06-15 13:10:57.620: E/ActivityManager(542): CPU usage from 8638ms to 2834ms ago:
06-15 13:10:57.620: E/ActivityManager(542):   2.7% 112/mediaserver: 0.1% user + 2.5% kernel
06-15 13:10:57.620: E/ActivityManager(542):   1.2% 542/system_server: 0.6% user + 0.5% kernel / faults: 10 minor
06-15 13:10:57.620: E/ActivityManager(542):   1% 100/vinput: 0% user + 1% kernel
06-15 13:10:57.620: E/ActivityManager(542):   1% 1339/com.example.myapp: 0.8% user + 0.1% kernel / faults: 19 minor
06-15 13:10:57.620: E/ActivityManager(542):   0.5% 102/local_opengl: 0% user + 0.5% kernel
06-15 13:10:57.620: E/ActivityManager(542):   0.3% 109/surfaceflinger: 0.3% user + 0% kernel
06-15 13:10:57.620: E/ActivityManager(542):   0% 3/ksoftirqd/0: 0% user + 0% kernel
06-15 13:10:57.620: E/ActivityManager(542):   0.1% 56/adbd: 0% user + 0.1% kernel
06-15 13:10:57.620: E/ActivityManager(542):   0% 103/local_gps: 0% user + 0% kernel / faults: 4 minor
06-15 13:10:57.620: E/ActivityManager(542):   0.1% 598/com.android.systemui: 0.1% user + 0% kernel / faults: 1 minor
06-15 13:10:57.620: E/ActivityManager(542):   0% 697/com.android.inputmethod.latin: 0% user + 0% kernel / faults: 5 minor
06-15 13:10:57.620: E/ActivityManager(542): 4% TOTAL: 1.4% user + 2.5% kernel
06-15 13:10:57.620: E/ActivityManager(542): CPU usage from 696ms to 1199ms later:
06-15 13:10:57.620: E/ActivityManager(542):   1.7% 100/vinput: 0% user + 1.7% kernel
06-15 13:10:57.620: E/ActivityManager(542): 2% TOTAL: 2% user + 0% kernel
如何防止我的应用程序在睡觉时忽略任何用户交互

如果值得一提的话,我正在捕捉
中断异常
,同时使
线程
休眠:

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
在相关小部件和操作栏项上调用
setEnabled(false)
,以防止它们接受用户输入。然后,在后台运行长期运行的工作,例如通过
AsyncTask
。完成工作后,在相关小部件和操作栏项上调用
setEnabled(true)
,例如
AsyncTask
onPostExecute()

请注意,您需要处理配置更改,以便在后台工作进行时,如果用户旋转屏幕,您可以重新禁用小部件和操作栏项

此外,请仅禁用与您的后台任务真正相关的小部件和操作栏项。不要阻止用户在应用程序中的其他位置导航到不依赖此工作的位置(帮助屏幕、关于屏幕等)


您还可以使用
ProgressBar
来代替“请稍候..文本视图”,或者在“请稍候..文本视图”之外使用“ProgressBar”.

您能详细解释一下为什么需要休眠主线程吗?您可以禁用对用户有良好解释的UI元素,并且不阻止主线程。您试图以这种方式解决的任何问题都可以通过其他方式得到更好的解决。因此,您可以通过解释“处理…”来显示进度指示器并在所需的时间内禁用UI将主线程置于睡眠状态不是一个好主意。退房如果你仍然想这样做,你可以尝试在你的活动进入睡眠前禁用触摸事件。看看这个-