Сбой Renderscript AsyncTask # 4

Это мой третий вопрос о RenderScript, и я запрограммировал проект обработки изображений более 3 месяцев с помощью rs. Rs мощный, я могу использовать параллельное ядро, похожее на шейдер OpenGLES, а также я могу написать последовательный код для размытия рамки. Это потрясающе!

Но теперь у меня новая проблема.

Обычно эффект отображается с помощью динамических эскизов на кнопке, прежде чем пользователи выберут, какой эффект применить. Поэтому я создаю поток для каждой миниатюры кнопки, и каждый поток имеет свой собственный rs и контекст. Поток создает и использует выделения по своему собственному 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.

Самое ужасное, что иногда некоторые строки пикселя в одной миниатюре заменяются пикселем другой миниатюры той же строки!!! Сбой происходит не каждый раз, в основном большое исходное изображение или один эффект, обработка которого занимает много времени, имеют более высокую вероятность завершения работы даже всей программы.

Это ошибка или rs не может быть вызвана многопоточностью?


person wxfred    schedule 02.04.2014    source источник


Ответы (1)


Ошибка не связана с многопоточностью.

Вызвано: android.support.v8.renderscript.RSInvalidStateException: использование объекта с несоответствующим контекстом.

Это означает, что объект RenderScript был создан в одном контексте, а затем использован в другом контексте. Делать это незаконно. Каждый контекст имеет свой уникальный набор объектов. Если вам нужно эффективно перемещать данные между ними, используйте USAGE_IO_INPUT и USAGE_IO_OUTPUT для распределения и свяжите их вместе.

person R. Jason Sams    schedule 02.04.2014
comment
Что, если вместо этого я использую контекст приложения (все время)? - person android developer; 06.04.2016