Android 上带有 RenderScript 的 RSInvalidStateException
RSInvalidStateException with RenderScript on Android
我使用 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%,在 Asus 上发生了 17%,在 Acer 上发生了 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;
}
我在一些旧设备上看到过这个,这是一个错误。这不是上面代码中的错误。
但是,上面的代码有一个大问题。你真的,真的不希望每次你想做一个小操作时都创建和销毁 RS 上下文。这是应该在应用程序的生命周期内完成一次的事情。重新使用上下文会给您带来重大的性能胜利。它还会保护您免受您所看到的错误的影响,因为它只会在应用程序拆卸时发生。
如果它继续给您带来问题,您可以通过安装消息处理程序来解决它,以吸收退出时的零星消息。
我使用 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%,在 Asus 上发生了 17%,在 Acer 上发生了 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;
}
我在一些旧设备上看到过这个,这是一个错误。这不是上面代码中的错误。
但是,上面的代码有一个大问题。你真的,真的不希望每次你想做一个小操作时都创建和销毁 RS 上下文。这是应该在应用程序的生命周期内完成一次的事情。重新使用上下文会给您带来重大的性能胜利。它还会保护您免受您所看到的错误的影响,因为它只会在应用程序拆卸时发生。
如果它继续给您带来问题,您可以通过安装消息处理程序来解决它,以吸收退出时的零星消息。