【发布时间】:2014-06-15 13:15:15
【问题描述】:
我正在设计一个要求我让main Thread 休眠一段时间的 Android 应用程序,我知道这会使应用程序冻结,并且 UI 不会是可编辑的材料,但是,这就是我在我的应用程序中需要的,我对此很好,问题是,当用户因此点击 UI 而main Thread正在睡觉,应用程序崩溃并给我以下Log:
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
如何防止我的应用在睡眠时忽略任何用户交互?
如果值得一提,我正在捕捉InterruptedException,同时让Thread 睡觉:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
【问题讨论】:
-
您能否再解释一下为什么需要让主线程休眠?
-
您可以禁用 UI 元素,对用户有很好的解释,并且不会阻塞主线程
-
无论你想用这种方式解决什么问题,都可以通过其他方式更好地解决。
-
因此您可以显示进度指示器并解释“处理中...”并在所需的持续时间内禁用 UI
-
让主线程休眠不是一个好主意。查看stackoverflow.com/a/6092143/254567。如果您仍然想这样做,您可以尝试在您的活动上禁用触摸事件,然后再使其进入睡眠状态。看看这个-stackoverflow.com/a/10721034/254567
标签: android multithreading android-ui thread-sleep