这是关于RenderScript的第3个问题,我用rs编写了一个超过3个月的图像处理项目。 Rs功能强大,我可以使用类似OpenGLES着色器的并行内核,也可以编写串行代码进行盒子模糊。太神奇了!
但现在,我遇到了一个新问题。
在用户选择要应用的效果之前,通常会在按钮上显示动态缩略图的效果。所以我为按钮的每个缩略图创建一个线程,每个线程都有自己的rs和context。线程通过自己的rs和上下文创建和使用分配,因此不应出现“使用具有不匹配上下文的对象”之类的错误。不幸的是,它发生了。
FATAL EXCEPTION: AsyncTask #4
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1027)
Caused by: android.support.v8.renderscript.RSInvalidStateException: using object with mismatched context.
at android.support.v8.renderscript.BaseObj.getID(BaseObj.java:66)
at android.support.v8.renderscript.Script.setVar(Script.java:382)
at com.xxxxxxxxxxx.xxxxxxxx.algorithms.filter.Script_BaseFilter.set_gTableTex(ScriptC_BaseFilter.java:280)
…………(not important)
我知道我不能使用多线程来使用OpenGLES渲染纹理,但我在rs中没有读到这样的东西。
最重要的是,有时某个缩略图中的某些像素行被同一行的另一个Thumbnial像素所取代!每次都不会发生崩溃,大多数情况下,大的原始图像或需要很长时间处理的一种效果甚至更有可能关闭整个程序的活动。
这是一个错误,还是多线程无法调用rs?
答案 0 :(得分:1)
错误与多线程无关。
引起:android.support.v8.renderscript.RSInvalidStateException:使用上下文不匹配的对象。
这意味着RenderScript对象是在一个上下文中创建的,然后在不同的上下文中使用。这样做是不合法的。每个上下文都有其唯一的对象集。如果您需要在它们之间有效地移动数据,请使用USAGE_IO_INPUT& USAGE_IO_OUTPUT分配并将它们链接在一起。