在Android上使用RenderScript的RSInvalidStateException

时间:2015-03-31 09:40:45

标签: android renderscript

我使用RenderScript进行模糊和其他操作。 它适用于大多数手机。在某些手机上,我随机获得以下异常:

android.renderscript.RSInvalidStateException: 
Received a message from the script with no message handler installed.        at android.renderscript.RenderScript$MessageThread.run(RenderScript.java:1087)

很难重现它,但在Crashlytics上我可以看到它在Hudl2上发生了75%,在华硕上发生了17%,在宏碁上发生了8%。所以所有便宜的手机。

有谁知道原因是什么以及如何解决?

这是在Jellybean +

上运行的代码
  @Override
  protected Bitmap blurBitmap(final Bitmap bitmap, final Bitmap argbBitmap, final Bitmap blurredBitmap) {
    final RenderScript renderScript = RenderScript.create(mContext);
    final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
    // Allocate memory for Renderscript to work with
    final Allocation input = Allocation.createFromBitmap(renderScript, argbBitmap);
    final Allocation output = Allocation.createFromBitmap(renderScript, blurredBitmap);

    script.setInput(input);
    script.setRadius(mRadius);
    script.forEach(output);
    output.copyTo(blurredBitmap);

    renderScript.destroy();

    bitmap.recycle();
    argbBitmap.recycle();
    return blurredBitmap;
  }

1 个答案:

答案 0 :(得分:3)

我在一些旧设备上看过这个,这是一个错误。这不是上面代码中的错误。

但是,上面的代码存在一个主要问题。每次你想做一个小操作时,你真的,真的不想创建和销毁RS上下文。对于应用程序的生命周期,这应该是一次。重新使用上下文将为您带来重大的性能胜利。它还可以保护您免受您所看到的错误,因为它只会在应用程序拆解时发生。

然后它继续给你带来问题,你可以通过安装消息处理程序来解决它,以便在退出时吸收偶发消息。