来自 asyncTask 的 Android 致命信号 6 (SIGABRT)

标签 android multithreading android-asynctask ui-thread

我有一个正在运行的安卓游戏,偶尔会在慢速设备上强制关闭并出现错误

Fatal signal 6 (SIGABRT), code -6 in tid 14620 (AsyncTask #1)

研究表明这是由于延迟了 UI 线程的执行,所以,我将代码的和平(大约 200 行位图和区域创建) bundle 到一个 AsyncTask(doInBackground 方法)中,我现在运行使用 task.execute 从 UI 线程执行该任务。

问题是,这并没有阻止错误。尽管应用程序应该在 asyncTask 中运行,但在执行该代码期间应用程序强制关闭的频率更高。

为了彻底起见,错误是在执行这部分代码(从 200ish block 中提取)期间触发的:

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 操作。有人知道这会导致 fatal error 吗?

最佳答案

在从极长且复杂的路径派生的区域上调用 Region.Op.INTERSECT 时,我也观察到了这一点。

对我有用的解决方案是维护所有路径路径点的记录,然后构建一个较小路径的列表,Region.Op.INTERSECT 操作将在这些路径上单独执行。

关于来自 asyncTask 的 Android 致命信号 6 (SIGABRT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28731669/

相关文章:

java - 如何在 intellij 中设置 android 源代码?

android - 从 docker 容器连接外部模拟器

java - 无法单击图像按钮

multithreading - 在.NET中启动 sleep 线程

java - AsyncTask执行后如何取消?

android - 在 Android 应用程序中实现声音

c# - 在 C# 中尝试多线程

c++ - 锁定步进 pthread 互斥锁

android - 如何创建异步任务以在加载屏幕上将声音加载到管理器中

Android:不显示对话框的Asynctask