2015-02-25 2 views
2

У меня работает Android игра, которая иногда принудительно закрывается на медленных устройствах с ошибкойAndroid фатальный сигнал 6 (SIGABRT) от AsyncTask

фатальный сигнал 6 (SIGABRT), код -6 в TID 14620 (AsyncTask # 1)

Исследование показало мне, что это было связанно с задерживая выполнение потока пользовательского интерфейса, так что, я укутан миру коды (около 200 строк растрового изображения и создания области) в качестве (метод AsyncTask doInBackground), и теперь я запускаю эту задачу из потока пользовательского интерфейса, используя 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); 

Любые идеи? Возможно ли, что код все еще работает в потоке пользовательского интерфейса? Может ли эта ошибка произойти из-за чего-то еще?

EDIT: Оказывается, ошибка исходит из манипуляций Region.op.XOR. Кто-нибудь видит, как это может привести к фатальной ошибке?

+0

Ваш не делает .get(), вы? – Petro

+0

Нет, не делает .get(). – user3161003

+0

Возможно, вы нажмете ограничение памяти на более старых устройствах, см. Http://stackoverflow.com/questions/3590443/what-is-the-maximum-memory-limits-per-application-for-android-2-2 – Petro

ответ

0

Я также наблюдал это при вызове Region.Op.INTERSECT в областях, полученных из чрезвычайно длинных и сложных путей.

Решение, которое работает для меня, состоит в том, чтобы вести запись всех путевых точек пути, а затем создавать список меньших путей, на которые выполняется операция Region.Op.INTERSECT по отдельности.

Смежные вопросы