안드로이드 사용자 질문/답변
(글 수 3,598)
회색님의 조언대로 SurfaceView에 새로운 다이얼로그 오브젝트를 생성시켜서 ok/cancel 다이얼로그를 띄우려고 했는데 해당 다이얼로그를 show()하는 위치(시점?)에 따라서 에러가 날때가 있습니다.
아래의 run()루프에서 doUpdate()가 프레임마다 게임을 구동하는 메소드입니다. 저 안에서 특정 이벤트에 (예, 게임이 끝났을 경우) Dialog의 show()를 호출하도록 하였습니다. 그런데 그 메소드가 호출됨과 동시에 에러가 뜨는군요.
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
synchronized (mSurfaceHolder) {
if (mTick == UPDATE_PERIOD) {
c = mSurfaceHolder.lockCanvas(null);
doUpdate();
doDraw(c);
mTick = 0;
} else {
mTick++;
}
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
============================================================
에러가 나는 시점에 logcat으로 확인한 디버깅 메세지입니다.
============================================================
W/dalvikvm( 772): threadid=21: thread exiting with uncaught exception (group=0x
4000fe70)
E/AndroidRuntime( 772): Uncaught handler: thread Thread-11 exiting due to uncau
ght exception
E/AndroidRuntime( 772): java.lang.RuntimeException: Can't create handler inside
thread that has not called Looper.prepare()
E/AndroidRuntime( 772): at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime( 772): at android.view.ViewRoot.<init>(ViewRoot.java:19
2)
E/AndroidRuntime( 772): at android.view.WindowManagerImpl.addView(Window
ManagerImpl.java:148)
E/AndroidRuntime( 772): at android.view.WindowManagerImpl.addView(Window
ManagerImpl.java:91)
E/AndroidRuntime( 772): at android.view.Window$LocalWindowManager.addVie
w(Window.java:392)
E/AndroidRuntime( 772): at android.app.Dialog.show(Dialog.java:231)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlanderneoVi
ew$Ext.actOnGameFinish(lunarlanderneoView.java:1019)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlander.f
inishGame(JHGamePipe.java:599)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlander.u
pdate(JHGamePipe.java:729)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlanderneoVi
ew$lunarlanderneoThread.doUpdate(lunarlanderneoView.java:559)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlanderneorVi
ew$lunarlanderneoThread.run(lunarlanderneoView.java:539)
I/Process ( 569): Sending signal. PID: 772 SIG: 3
I/dalvikvm( 772): threadid=7: reacting to signal 3
I/dalvikvm( 772): Wrote stack trace to '/data/anr/traces.txt'
D/dalvikvm( 569): GC freed 11877 objects / 547240 bytes in 153ms
I/Process ( 772): Sending signal. PID: 772 SIG: 9
I/WindowManager( 569): WIN DEATH: Window{4372f628 com.myname.android.lunarlanderneo/com.myname.android.lunarlanderneo.lunarlander paused=false}
I/ActivityManager( 569): Process com.myname.android.lunarlanderneo (pid 772) has
died.
I/WindowManager( 569): WIN DEATH: Window{43730408 SurfaceView paused=false}
W/InputManagerService( 569): Got RemoteException sending setActive(false) notif
ication to pid 772 uid 10019
답변에 미리 감사 드립니다.
아래의 run()루프에서 doUpdate()가 프레임마다 게임을 구동하는 메소드입니다. 저 안에서 특정 이벤트에 (예, 게임이 끝났을 경우) Dialog의 show()를 호출하도록 하였습니다. 그런데 그 메소드가 호출됨과 동시에 에러가 뜨는군요.
@Override
public void run() {
while (mRun) {
Canvas c = null;
try {
synchronized (mSurfaceHolder) {
if (mTick == UPDATE_PERIOD) {
c = mSurfaceHolder.lockCanvas(null);
doUpdate();
doDraw(c);
mTick = 0;
} else {
mTick++;
}
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
============================================================
에러가 나는 시점에 logcat으로 확인한 디버깅 메세지입니다.
============================================================
W/dalvikvm( 772): threadid=21: thread exiting with uncaught exception (group=0x
4000fe70)
E/AndroidRuntime( 772): Uncaught handler: thread Thread-11 exiting due to uncau
ght exception
E/AndroidRuntime( 772): java.lang.RuntimeException: Can't create handler inside
thread that has not called Looper.prepare()
E/AndroidRuntime( 772): at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime( 772): at android.view.ViewRoot.<init>(ViewRoot.java:19
2)
E/AndroidRuntime( 772): at android.view.WindowManagerImpl.addView(Window
ManagerImpl.java:148)
E/AndroidRuntime( 772): at android.view.WindowManagerImpl.addView(Window
ManagerImpl.java:91)
E/AndroidRuntime( 772): at android.view.Window$LocalWindowManager.addVie
w(Window.java:392)
E/AndroidRuntime( 772): at android.app.Dialog.show(Dialog.java:231)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlanderneoVi
ew$Ext.actOnGameFinish(lunarlanderneoView.java:1019)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlander.f
inishGame(JHGamePipe.java:599)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlander.u
pdate(JHGamePipe.java:729)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlanderneoVi
ew$lunarlanderneoThread.doUpdate(lunarlanderneoView.java:559)
E/AndroidRuntime( 772): at com.myname.android.lunarlanderneo.lunarlanderneorVi
ew$lunarlanderneoThread.run(lunarlanderneoView.java:539)
I/Process ( 569): Sending signal. PID: 772 SIG: 3
I/dalvikvm( 772): threadid=7: reacting to signal 3
I/dalvikvm( 772): Wrote stack trace to '/data/anr/traces.txt'
D/dalvikvm( 569): GC freed 11877 objects / 547240 bytes in 153ms
I/Process ( 772): Sending signal. PID: 772 SIG: 9
I/WindowManager( 569): WIN DEATH: Window{4372f628 com.myname.android.lunarlanderneo/com.myname.android.lunarlanderneo.lunarlander paused=false}
I/ActivityManager( 569): Process com.myname.android.lunarlanderneo (pid 772) has
died.
I/WindowManager( 569): WIN DEATH: Window{43730408 SurfaceView paused=false}
W/InputManagerService( 569): Got RemoteException sending setActive(false) notif
ication to pid 772 uid 10019
답변에 미리 감사 드립니다.




아마도 UI쓰레드가 아닌 별도의 쓰레드에서 처리하는 듯한데 그곳에서 바로 호출하면 에러가 납니다. 이런 경우 Handler를 이용해서 처리하도록 해야합니다.
http://www.mobileplace.co.kr/4374 타이밍 작업에 대해서만 정리했지만 Delay를 주지 않고 Dialog만 뛰우도록 실행시키면 됩니다.