初始化显示事件接收器失败
Posted
技术标签:
【中文标题】初始化显示事件接收器失败【英文标题】:Failed to initialize display event receiver 【发布时间】:2014-09-25 10:45:51 【问题描述】:我制作了一个应用程序,它会定期启动从服务器检索信息的服务。
我使用 AlarmManager 来安排服务。 这工作正常,应用程序每 30 分钟收到一次警报。 该应用程序运行良好,但在整晚不活动后 - 我启动该应用程序时,它崩溃并出现错误:“无法初始化显示事件接收器”。
否则这完美无缺。
这个问题我找了很久,发现其他人也有同样的问题,但暂时没有解决办法。
Process: it.unipi.iet.portolan.traceroute, PID: 13092
java.lang.RuntimeException: Failed to initialize display event receiver. status=-2147483648
at android.view.DisplayEventReceiver.nativeInit(Native Method)
at android.view.DisplayEventReceiver.<init>(DisplayEventReceiver.java:61)
at android.view.Choreographer$FrameDisplayEventReceiver.<init>(Choreographer.java:695)
at android.view.Choreographer.<init>(Choreographer.java:169)
at android.view.Choreographer.<init>(Choreographer.java:72)
at android.view.Choreographer$1.initialValue(Choreographer.java:98)
at android.view.Choreographer$1.initialValue(Choreographer.java:91)
at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:430)
at java.lang.ThreadLocal.get(ThreadLocal.java:65)
at android.view.Choreographer.getInstance(Choreographer.java:194)
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:370)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2871)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
at android.app.ActivityThread.access$800(ActivityThread.java:145)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5141)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
一个问题:在您的服务中,您是否引用了正确的上下文? 请添加出现此错误的代码。 @barq 崩溃日志没有指向他的代码。我还收到了我在 Android 5.1.1 上的应用程序。我正在使用 Crashlytics,但仍然不知道它发生在哪里。 然后提供有关如何重现此问题的最小设置。 显示导致错误的相关代码。 【参考方案1】:只是一些信息,我不明白为什么, 消息来自:
frameworks/base/core/jni/android_view_DisplayEventReceiver.cpp:4239: message.appendFormat("Failed to initialize display event receiver. status=%d", status);
或者这个
frameworks/base/libs/androidfw/DisplayEventDispatcher.cpp:1427: ALOGW("Failed to initialize display event receiver, status=%d", result);
status -2147483648 = 0x800000000
它从 DisplayEventReceiver 返回:
/* initCheck returns the state of DisplayEventReceiver after construction.*/
status_t initCheck() const;
并查看 DisplayEventReceiver.cpp
status_t DisplayEventReceiver::initCheck() const
if (mDataChannel != NULL)
return NO_ERROR;
return NO_INIT;
看起来 mDataChannel
为 NULL,
在构造函数中初始化的mDataChannel
DisplayEventReceiver::DisplayEventReceiver()
sp<ISurfaceComposer> sf(ComposerService::getComposerService());
if (sf != NULL)
mEventConnection = sf->createDisplayEventConnection();
if (mEventConnection != NULL)
mDataChannel = mEventConnection->getDataChannel();
所以 sf SurfaceComposer 为 NULL 或者 sf->createDisplayEventConnection 返回 NULL。
在文件./system/core/include/utils/Errors.h
...
NO_ERROR =0
UNKNOWN_ERROR = (-2147483647-1), // INT32_MIN value
NO_MEMORY = -ENOMEM,
INVALID_OPERATION = -ENOSYS,
BAD_VALUE = -EINVAL,
BAD_TYPE = (UNKNOWN_ERROR + 1),
NO_INIT = -ENODEV,
...
看来状态必须NO_INIT
...
【讨论】:
https://android.googlesource.com/platform/frameworks/base/+/master/libs/androidfw/DisplayEventDispatcher.cpp
以上是关于初始化显示事件接收器失败的主要内容,如果未能解决你的问题,请参考以下文章