窗口小部件导致DeadObjectException - 小包裹上的事务失败

时间:2017-09-19 11:36:26

标签: android widget

我想在显示小部件并开始收听后立即跟踪异常:

// the relevant stack trace, the rest is comming from my code 
// before the code line I posted below
java.lang.RuntimeException: system server dead?
    at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:189)
    at com.my.app.utils.WidgetUtil.a(SourceFile:231)
    ...
    android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
    at android.os.BinderProxy.transactNative(Native Method)
    at android.os.BinderProxy.transact(Binder.java:503)
    at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.startListening(IAppWidgetService.java:481)
    at android.appwidget.AppWidgetHost.startListening(AppWidgetHost.java:185)
    at com.my.app.utils.WidgetUtil.a(SourceFile:231)
    ...

我的代码中的源代码如下:

 mAppWidgetManager = AppWidgetManager.getInstance(context);
 mAppWidgetHost = new AppWidgetHost(context, R.string.app_name);
 mAppWidgetHost.startListening(); // <= this line leads to the crash

观察

  • 我的应用程序在很多手机上正常工作(实际上只有一个)
  • 上述崩溃只发生在一个用户设备上(SM-N910C(Samsung Note 4),Android 6.0.1)
  • 用户说,这些小部件在他的发射器中工作正常

有谁知道可能导致这种情况的原因是什么?这是我可以在我的应用程序中解决的问题吗?用户说小部件在他的发射器中正常工作......

2 个答案:

答案 0 :(得分:2)

因此,一个简单的谷歌搜索引导我对DeadObjectException的定义: -

  

您呼叫的对象已经死亡,因为其托管过程已不复存在。

从这一点来看,您很明显会收到此错误,因为托管mAppWidgetHost的进程已被终止。

现在的问题是你为什么会收到这个错误。覆盖和记录onDestroy()以监控它可能很有用,绝对值得一试。但是,由于它在除了一个设备之外的所有设备上工作,因此onDestroy()方法可能没有任何问题。相反,操作系统会在您访问该对象之前终止该进程。

那么,现在为什么操作系统会这样做呢?这个问题让我bal for最长的时间。我仍然没有明确的答案或解决方案,尽管谷歌搜索与各种相关的问题。但是,在花了相当多的时间进行搜索之后,我注意到了一个特殊性 - 这个例外的大多数问题,例如thisthis和你的三星设备都会发生。

我的猜测是三星的底层架构导致了这个问题。而且,虽然我没有理由为什么会发生这种情况,或者即使经过更多的搜索也没有合理的解决方案,但这仍然是一个开始找到针对三星设备的工作。

<强>更新

我搜索了一下,然后遇到this回答。看一下问题作者对问题的最后评论: -

  

最后它只是通过清单文件中的一行代码正常工作,这里是android:hardwareAccelerated="false"如果有人得到以下类型的错误,请尝试添加上面的行信号11(SIGSEGV),代码1( SEGV_MAPERR)

我不知道这背后的逻辑,或者它是否会起作用。只是分享它,希望它可以帮助你 - 即使是最微小的形式。

答案 1 :(得分:0)

DeadObjectException :

您呼叫的对象已经死亡,因为其托管过程已不复存在。

可能的解决方案:

1)覆盖服务的onDestroy()方法,并观察哪些事件流导致它。如果您在不经过此方法的情况下捕获DeadObjectException,则您的服务应该已被操作系统杀死。

2)通过删除Typeface,这可能是因为我在资产文件夹中使用的ttf请尝试评论字体并测试它希望它肯定会起作用

3)将所有代码放入onCreate。从那里你会看到像NullPointerException这样的罪魁祸首,但你的代码已经顺利运行。