2017-09-19 31 views
4

我發現了以下情況例外,只要我想展示一個小部件,並開始收聽失敗:窗口小部件導致DeadObjectException - 交易小包裹

// 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)
  • 用戶說,他的發射器

有沒有人有一個想法可能會導致這種情況?這是我可以在我的應用程序中解決的問題嗎?該用戶說小部件在其發射工作正常...

回答

0
DeadObjectException : 

您呼叫的對象已經死亡,因爲它的宿主進程不再存在。

可能的解決方案:

1)重寫你的服務的onDestroy()方法和手錶導致它什麼事件流中。如果你沒有通過這種方法趕上DeadObjectException,你的服務應該已經被操作系統殺死了。通過移除Typeface

2),這可能是因爲我是從資產的文件夾中使用,請重評的字樣,並測試它希望這將肯定

3工作,這TTF的)把所有的代碼裏面的onCreate 。從那裏你會看到像NullPointerException這樣的罪魁禍首,但你的代碼已經可以順利運行了。

+0

你知道小部件是由其他應用程序實現的,而我只告訴其他應用程序「我使用ID顯示小部件,所以請在小部件需要更新時通知我」。那麼我應該如何攔截其他應用程序代碼? – prom85

0

所以,一個簡單的谷歌搜索使我對這個定義的DeadObjectException: -

您呼叫的對象已經死亡,因爲它的宿主進程不再存在。

由此看來,顯然你得到這個錯誤,因爲託管mAppWidgetHost的進程已被殺死。

現在的問題是,你爲什麼得到這個錯誤。覆蓋並記錄onDestroy()來監視它可能是有用的,絕對值得一試。但是,由於它在除一個設備之外的所有設備上工作,所以它很可能沒有任何錯誤的onDestroy()方法。相反,在訪問該對象之前,操作系統正在關閉該進程。

那麼,現在爲什麼操作系統這樣做呢?這個問題讓我沉迷了最長的時間。儘管有大量谷歌搜索涉及到各種問題,但我仍然沒有明確的答案或解決方案。但是,在花費大量時間搜索之後,我注意到一個特點 - 這個例外的大部分問題,例如this,this以及您的三星設備。

我的猜測是三星的底層架構導致了這個問題。而且,雖然我沒有理由說明爲什麼會發生這種情況,但即使在進行更多搜索之後,這仍然是一個開始找到針對三星設備的解決方案。

UPDATE

我搜索了一點,整個this答案出來。看看最後一個註釋通過對問題的問題作者: -

最後,它工作正常只是在manifest文件的代碼行,這裏是android:hardwareAccelerated="false"如果有人得到如下樣的錯誤,請通過將上述線路信號11(SIGSEGV),碼1(SEGV_MAPERR)

我不知道這背後的邏輯或者它是否會工作或不嘗試。只是希望它可以幫助你 - 即使是最小的形式。

+0

同樣,我該怎麼做?小部件由其他應用程序提供,我所有的應用程序都在我的代碼示例中,我只告訴其他應用程序「我使用ID顯示小部件,所以無論何時此小部件需要更新都請通知我」,並且此註冊在指定設備上立即崩潰... – prom85

+0

附加信息:我知道它在samsung s6,s7和s8上工作,所以它可能是與note 4有關的一些設備特定問題,但我不知道爲什麼它在我的應用程序中崩潰,但不是在默認啓動器... – prom85

+0

您是否嘗試過似乎適用於其他人的hardwareaccelarated = false方法? –

相關問題