当前位置:   article > 正文

Android之android.os.DeadObjectException原因_system.err: android.os.deadobjectexception

system.err: android.os.deadobjectexception

近期使用到AIDL跨进程通信,出现:

  1. 12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException
  2. 12-15 09:28:12.372: W/System.err(5412): at android.os.BinderProxy.transactNative(Native Method)
  3. 12-15 09:28:12.372: W/System.err(5412): at android.os.BinderProxy.transact(Binder.java:496)
以上错误,查找问题原因,网友大部都说是远程remote进程崩溃导致此问题出现。

解决办法:

在调用者的程序清单AndroidManifest.xml文件中application下添加android:hardwareAccelerated="false"就可以解决了。

<application android:hardwareAccelerated="true" ...>

从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.硬加速使用GPU承担了所有在View的canvas上执行的绘制操作.

  启用硬加速最简单的的方法是对整个应用启用硬件速.如果你的应用只使用标准的view和Drawable,全局启用硬加速将不会带来任何负面影响.然而,因为硬加速不是被所有的2D绘制所支持,所以启用它时可能对你的自定义绘制产生影响.出现的问题经常是不可见的,也可能是异常,或错误地显示了像素.为了避免这些问题,Android提供了在以下各级别上启用或禁止硬加速的能力:

Application  Activity Window  View

  如果你的应用使用了自定义绘制,需要在真实的设备上启用硬加速进行测试来找出问题."不支持的绘制操作"一节描述了已知的不能被硬加速的绘制操作以及如何避开它们.

控制硬加速

  你可以在以下级别上分别控制硬加速:

Application  Activity  Window  View

Application级
  在你的manifest文件中,把以下属性添加到<application>标签来对你的整个应用启用硬加速:

<applicationandroid:hardwareAccelerated="true" ...>

Activity级
  如果你的应用在全局启用硬加速时行为不正确,你可以对个别activities单独启用硬加速.欲在actvity级别启用或禁止硬加速,你可以对<activity>元素使用android:hardwareAccelerated属性.下面的例子在整个应用中启用了硬加速但对一个activity禁止了硬加速:

<applicationandroid:hardwareAccelerated="true">

<activity... />

<activityandroid:hardwareAccelerated="false" />

</application>

Window级
  如果你需要更高颗粒度的控制,你可以使用以下代码为一个window启用硬加速:

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注:现在你还不能在window级别禁止硬加速.

Viewlevel

你可以在运行时使用以下代码禁止个别的View的硬加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

注:当前你不能在View级别启用硬加速.View层有除禁止硬加速之外的其它功能.

判定一个View是否能被硬加速

  有时一个应用了解是否启用了硬件速是很有用的,对那些自定义View之类的东西尤其重要.在你的应用做了一些不被最新的管线所支持的自定义绘制时这更加重要.

  有两种方法可以检查应用是否被硬加速:

View.isHardwareAccelerated():如果View附加到一个硬加速的window上就返回true.

Canvas.isHardwareAccelerated():如果Canvas被硬加速了就返回true.

 

  如果你必须在你的绘制代码中做这个,应使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().当一个view附加到一个硬加速的window上,它仍可以使用非硬件速的Canvas进行绘制操作.比如当为了高速缓存而把一个view画到一个bitmap中.


每次做项目都会遇见一些特别简单的问题,但是又很费时间来让你解决的问题。
1.本身想实现一个简单的画廊效果,可是每次图片的显示都不能显示在正中的位置,真的很烦人,也花费了很长时间。最终还是知道了原因。解决这个问题的方法有很多种,但是就这一种比较简单(虽然网上说的会占用内存,不过要是设置android:hardwareAccelerated=”false”应该就不会吧,我也不清楚。哈哈)
办法:android:hardwareAccelerated=”false”

2.CarView 阴影效果的显示,如果不开启硬件加速,有的手机就不会显示阴影效果,并不是说只有android5.0以上的系统才会这样,其它的手机也会有这种现象。
办法:android:hardwareAccelerated=”true”

最后总结:如果你的项目中,出现了上面两种情况(当然可能不是同一个问题),如果android:hardwareAccelerated=”false”真的是不占用内存的话,可以把它设置在application中,或者你也可以设置在需要用到的activity中,android:hardwareAccelerated=”true”的话,就配置在用到的activity中就可以了。



声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号