【问题标题】:making the main Thread sleeps使主线程休眠
【发布时间】:2014-06-15 13:15:15
【问题描述】:

我正在设计一个要求我让main Thread 休眠一段时间的 Android 应用程序,我知道这会使应用程序冻结,并且 UI 不会是可编辑的材料,但是,这就是我在我的应用程序中需要的,我对此很好,问题是,当用户因此点击 UImain 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


【解决方案1】:

在相关小部件和操作栏项目上调用setEnabled(false),以防止它们接受用户输入。然后,在后台运行您长期运行的工作,例如通过AsyncTask。工作完成后在相关的小部件和操作栏项上调用setEnabled(true),例如AsyncTaskonPostExecute()

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

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

使用ProgressBar 代替或补充您的“请稍候.. 文本视图”可能会更好地为您服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2011-09-18
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多