Android异步任务出现致命信号6(SIGABRT)的错误

3

我有一个工作的安卓游戏,但在慢设备上偶尔会出现崩溃错误:

致命信号6(SIGABRT),代码-6,在tid 14620(AsyncTask#1)中

研究表明这是由于延迟执行UI线程导致的,因此我将代码段(大约200行位图和区域创建)打包到AsyncTask(doInBackground方法)中,并使用task.execute从UI线程运行该任务。

问题是,这并没有以任何方式停止错误。事实上,在执行该代码期间,应用程序更频繁地强制关闭,尽管它应该在asyncTask中运行。

为了彻底,错误是在执行代码的这部分触发的(从200多个块中提取):

Back.outerPath.setFillType(Path.FillType.EVEN_ODD);

    Region tempRegion = new Region(PathBoundsRectangle);

    Back.outerRegion.setPath(Back.outerPath, tempRegion);
    Back.innerRegion.setPath(Back.innerPath, tempRegion);
    Back.fastRegion.setPath(Back.speedPath, tempRegion);
    Back.slowRegion.setPath(Back.slowPath, tempRegion);

    Back.outerRegion.op(Back.innerRegion, Region.Op.XOR);

    Matrix scaleMatrix = new Matrix();
    RectF rectF = new RectF();
    Back.innerPath.computeBounds(rectF, true);
    scaleMatrix.setScale(1.1f, 1.1f,rectF.centerX(),rectF.centerY());
    Back.innerPath.transform(scaleMatrix);

    Back.outerPath.computeBounds(rectF, true);
    scaleMatrix.setScale(0.9f, 0.9f,rectF.centerX(),rectF.centerY());
    Back.outerPath.transform(scaleMatrix);

    Back.outerSideBandRegion.setPath(Back.outerPath, tempRegion);
    Back.outerSideBandRegion.op(Back.outerRegion, Region.Op.XOR);

    Back.innerSideBandRegion.setPath(Back.innerPath, tempRegion);
    Back.innerSideBandRegion.op(Back.innerRegion, Region.Op.XOR);

有什么想法吗?代码是否仍在UI线程上运行?这个错误可能是由其他原因引起的吗?

编辑:事实证明,错误来自Region.op.XOR操作。有人看到这可能会导致致命错误吗?


你难道没有使用 .get() 方法吗? - Petro
不,不要使用 .get()。 - user3161003
您可能在旧设备上遇到了内存限制问题,请参考:https://dev59.com/elDTa4cB1Zd3GeqPGRlQ - Petro
1
你可以尝试缩小渲染“区域”的大小,这将减少整体内存占用。 - Petro
没问题,如果这有帮助的话请告诉我,我会给出一个简短的答案,以便让未来的读者知道。祝你好运! - Petro
显示剩余6条评论
1个回答

0
我在调用由极长和复杂路径派生的区域时,也观察到了这一点。
对我有效的解决方案是维护所有路径航点的记录,然后构建一个较小路径的列表,对其执行Region.Op.INTERSECT 操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接