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

Posted

技术标签:

【中文标题】来自 asyncTask 的 Android 致命信号 6 (SIGABRT)【英文标题】:Android Fatal signal 6 (SIGABRT) from asyncTask 【发布时间】:2015-04-28 04:38:40 【问题描述】:

我有一个正常工作的 android 游戏,它偶尔会在慢速设备上强制关闭并出现错误

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

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

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

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

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() 是吗? 不,不做 .get()。 您可能会遇到旧设备的内存限制,请参阅:***.com/questions/3590443/… Petro,尽管进行了修改,但应用程序强制以相同的错误关闭。 您可以尝试缩小渲染“区域”的大小,这将减少整体内存占用。 【参考方案1】:

在对源自极长和复杂路径的区域调用 Region.Op.INTERSECT 时,我也观察到了这一点。

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

【讨论】:

以上是关于来自 asyncTask 的 Android 致命信号 6 (SIGABRT)的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask Android 中的致命信号 6 (SIGABRT)

我有一个 AsyncTask android 的致命错误

E / AndroidRuntime:致命异常:Android的AsyncTask#1 ERROR

获取“致命异常 AsyncTask #1”

AndroidRuntime:致命异常:AsyncTask #1 进程

到 phpmyadmin 的致命异常 AsyncTask 连接