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

时间:2015-02-25 23:22:18

标签: android multithreading android-asynctask ui-thread

我有一个有效的安卓游戏,偶尔强制关闭慢速设备上的错误

  

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

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

问题是,这绝不会阻止错误。如果应用程序强制在执行该代码期间更频繁地关闭,尽管它应该在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操作。有人看到这可能导致致命错误吗?

1 个答案:

答案 0 :(得分:0)

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

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