Я нашел это решение, но к сожалению, это не сработало для меня. Когда я показываю только небольшой движущийся прямоугольник, поэтому анимация не облагается налогом, он работает нормально, но я хочу отображать некоторые кадры анимации, которые я загружаю с помощью .png, и всякий раз, когда я сворачиваю свое приложение или нажимаю кнопку «Назад», я немедленно получите ошибку SIGSEV.
Для одного экрана, где я рисую график с большим количеством точек, я нашел решение, в котором я просто останавливаю поток после того, как закончу рисовать линии, но, поскольку мне нужно отобразить движущуюся анимацию, я не могу сделать это в этом конкретный фрагмент.
Мой код для потока рендеринга выглядит так:
private class RenderThread extends Thread {
private volatile boolean mRunning = true;
int framecount = 1;
@Override
public void run() {
while (mRunning && !Thread.interrupted()) {
final Canvas canvas = mSimulationAnimationView.lockCanvas(null);
try {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
drawCar(canvas);
} finally {
mSimulationAnimationView.unlockCanvasAndPost(canvas);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// Sleep if the Thread is interrupted
}
}
}
public void stopRendering() {
interrupt();
mRunning = false;
}
private void drawCar(Canvas canvas){
if(framecount==1){
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.piston_frame_one), 10, 10, null);
framecount++;
}
else{
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.piston_frame_two), 10, 10, null);
framecount--;
}
}
}//RenderThread
Очевидно, что это основано на примере Ромена Гая, который можно найти здесь
Помощь очень ценится!
Редактировать: аварийный дамп вот такой:
********** Crash dump: **********
Build fingerprint: 'google/hammerhead/hammerhead:5.1.1/LMY48B/1863243:user/release-keys'
pid: 16130, tid: 16343, name: Thread-19966 >>> package.package.package <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x9ee3ad10
Stack frame #00 pc 001b474a /system/lib/libskia.so (S32A_Opaque_BlitRow32_neon_src_alpha(unsigned int*, unsigned int const*, int, unsigned int)+109)
Stack frame #01 pc 001072fb /system/lib/libskia.so
Stack frame #02 pc 00103793 /system/lib/libskia.so
Stack frame #03 pc 0010385f /system/lib/libskia.so (SkScan::FillIRect(SkIRect const&, SkRegion const*, SkBlitter*)+198)
Stack frame #04 pc 0010395f /system/lib/libskia.so (SkScan::FillIRect(SkIRect const&, SkRasterClip const&, SkBlitter*)+36)
Stack frame #05 pc 000e0e27 /system/lib/libskia.so (SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkPaint const&) const+464)
Stack frame #06 pc 000d90c9 /system/lib/libskia.so
Stack frame #07 pc 000d91b1 /system/lib/libskia.so (SkCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+116)
Stack frame #08 pc 000947d1 /system/lib/libandroid_runtime.so (android::SkiaCanvas::drawBitmap(SkBitmap const&, float, float, SkPaint const*)+12)
Stack frame #09 pc 0008a7b7 /system/lib/libandroid_runtime.so
Stack frame #10 pc 007eff33 /data/dalvik-cache/arm/system@[email protected]
drawBitmap()
. SIGSEGV с SEGV_MAPERR указывает, что он пытается получить доступ к странице, которая не сопоставлена с процессом. Я предполагаю, что хранилище пикселей Bitmap отбрасывается, когда действие приостанавливается, но каким-то образом приложение все еще пытается получить доступ к данным через этот указатель. - person fadden   schedule 18.06.2015Thread.join()
звонок вstopRendering()
? Вызовinterrupt()
не ожидает остановки другого потока, поэтому, если вы или платформа приложения выполняете очистку, пока ваш поток все еще работает, возможен сбой. - person fadden   schedule 19.06.2015