在我的 Android 应用程序中,我随机遇到非常奇怪的崩溃。当我打开应用程序时,我正在启动屏幕上从服务器获取数据。当应用程序登陆主页时,整个应用程序突然关闭,以下是日志中打印的内容:
ANR in com.test (com.test/.activities.SplashActivity)
PID: 16020
Reason: Input dispatching timed out (49abf6 com.test/com.test.activities.SplashActivity (server) is not responding. Waited 5004ms for FocusEvent(hasFocus=false))
Parent: com.test/.activities.SplashActivity
Load: 29.87 / 30.79 / 30.77
----- Output from /proc/pressure/memory -----
some avg10=0.00 avg60=0.00 avg300=0.00 total=3115344
full avg10=0.00 avg60=0.00 avg300=0.00 total=1338179
----- End output from /proc/pressure/memory -----
此异常的原因是 UI 线程被阻塞,并且您的应用程序超过 5 秒没有响应。
仔细检查从服务器获取数据的代码是否不在主线程上执行。此外,如果您使用广播接收器执行任何可能需要 10 秒的逻辑,也会导致此问题。
还需要检查从服务器获取数据的代码中的异常处理。
您也可以看看以下页面: https://developer.android.com/training/articles/perf-anr.html#anr
当我试图让我的前台服务等待一段时间时,我遇到了这个问题。修复方法是使用 android.os.Handler。这将使块内的代码在
delay_in_millis
毫秒后运行,并且不会使整个服务休眠(然后出现另一个错误 App isn't responding
)。
import android.os.Handler;
new Handler().postDelayed(new Runnable() {
public void run() {
// code to run after delay
}
}, delay_in_millis);