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

9

当我想要显示小部件并开始监听时,我会立即收到以下异常:

// 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 (三星Note 4), Android 6.0.1)
  • 用户说,在他的启动器中这些小部件可以很好地工作

有人知道是什么原因导致了这个问题吗?这是我可以在我的应用程序中解决的问题吗?用户表示小部件在他的启动器中工作正常...

2个回答

3
因此,通过简单的谷歌搜索,我找到了DeadObjectException的定义:-
“您正在调用的对象已死亡,因为其托管进程不再存在。”
由此可见,您之所以会收到此错误消息,是因为托管mAppWidgetHost的进程已被终止。
现在的问题是,为什么会出现此错误。覆盖并记录onDestroy()来监视它可能很有用,并且确实值得一试。但是,由于除一个设备外所有设备都可以工作,因此onDestroy()方法很可能没有问题。相反,在您访问该对象之前,操作系统将终止该进程。
那么,现在为什么操作系统这样做呢?这个问题让我困惑了很长时间。尽管进行了大量与问题相关的谷歌搜索,我仍然没有明确的答案或解决方案。但是,在花费了相当多的时间搜索后,我注意到一个特点-大多数此异常的问题(例如这个这个和您的问题)都会在三星设备上发生。
我猜测是三星的底层架构导致了这个问题。尽管我没有找到为什么会出现这种情况或一个合理的解决方案,但仍可以从针对三星设备的工作中找到解决方案的起点。
更新
我搜索了更多,发现这个答案。看一下问题作者在问题中的最后一条评论:-
“最终,通过清单文件中的一行代码,android:hardwareAccelerated="false",它可以正常工作。如果有人遇到以下类似错误,请尝试添加上述行信号11(SIGSEGV),代码1(SEGV_MAPERR)”
我不知道其中的逻辑或是否有效。只是分享它,希望它可以在最小形式下帮助您。

再问一遍,我该怎么做?小部件由其他应用程序提供,我的应用程序只是在我的代码示例中告诉另一个应用程序“我显示具有ID的小部件,请在此小部件需要更新时通知我”,并且这个注册在指定设备上立即崩溃... - prom85
附加信息:我知道它可以在三星S6、S7和S8上运行,所以这可能是Note 4的某些设备特定问题,但我还不知道为什么它会在我的应用程序中崩溃,而在默认启动器中却没有。 - prom85
1
你尝试过硬件加速 = false 的方法吗?这个方法似乎对其他人有效。 - Rohan Stark

0
DeadObjectException :

您调用的对象已经死亡,因为其托管进程不再存在。

可能的解决方案:

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

2)通过删除Typeface,这可能是因为我从资产文件夹中使用的ttf,请尝试注释掉typeface并进行测试,希望它肯定会起作用。

3)将所有代码放在onCreate中。从那里,您将看到是什么罪魁祸首,例如NullPointerException,但您的代码已经平稳运行。


你知道小部件是由其他应用程序实现的,我只是告诉其他应用程序“我使用ID显示小部件,请在需要更新此小部件时通知我”。那么我该如何拦截其他应用程序的代码? - prom85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接