안드로이드 개발 질문/답변
(글 수 45,052)
현재 마켓에 올라간 앱이 에러를 뱉어내고 있습니다-ㅁ-;
아래 Stack Trace를 보면 setVisibility를 AsyncTask 스레드에서 해서 checkThread에서 Crash가 나는거 같은데 재현이 안되고 있어서 고치는데 애를 먹고 있습니다;;
검색해본 결과 UI 변경을 다른 Thread에서 할 경우 크래쉬난다고 해서 setVisibility 하는 부분은 핸들러를 사용하여 아래와 같이 묶어주고 있습니다.
mHandler.post(new Runnable() {
public void run() {
......
}
});
하지만 에러는 계속 발생학 있고 감을 못잡고 있는 상황입니다.
AsyncTask Thread는 어디서 생성이 되는지도 잘 모르겠고 (광고나 OpenFeint 등 다른 라이브러리가 생성하는듯 함?) 재현이 안되니 디버깅도 어렵네요.
아래와 같은 Stack Trace에서 확실히 문제되는 점이나 버그를 잡아낼 방법을 집어내주시면 고맙겠습니다__)
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)
Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2836)
at android.view.ViewRoot.requestLayout(ViewRoot.java:595)
at android.view.View.requestLayout(View.java:8203)
at android.view.View.requestLayout(View.java:8203)
at android.view.View.requestLayout(View.java:8203)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
at android.view.View.requestLayout(View.java:8203)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
at android.view.View.requestLayout(View.java:8203)
at android.view.View.setFlags(View.java:4579)
at android.view.View.setVisibility(View.java:3108)
at c.a(Unknown Source)
at c.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more
아래 Stack Trace를 보면 setVisibility를 AsyncTask 스레드에서 해서 checkThread에서 Crash가 나는거 같은데 재현이 안되고 있어서 고치는데 애를 먹고 있습니다;;
검색해본 결과 UI 변경을 다른 Thread에서 할 경우 크래쉬난다고 해서 setVisibility 하는 부분은 핸들러를 사용하여 아래와 같이 묶어주고 있습니다.
mHandler.post(new Runnable() {
public void run() {
......
}
});
하지만 에러는 계속 발생학 있고 감을 못잡고 있는 상황입니다.
AsyncTask Thread는 어디서 생성이 되는지도 잘 모르겠고 (광고나 OpenFeint 등 다른 라이브러리가 생성하는듯 함?) 재현이 안되니 디버깅도 어렵네요.
아래와 같은 Stack Trace에서 확실히 문제되는 점이나 버그를 잡아낼 방법을 집어내주시면 고맙겠습니다__)
Exception class
android.view.ViewRoot$CalledFromWrongThreadException
Source method
ViewRoot.checkThread()
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)
Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2836)
at android.view.ViewRoot.requestLayout(ViewRoot.java:595)
at android.view.View.requestLayout(View.java:8203)
at android.view.View.requestLayout(View.java:8203)
at android.view.View.requestLayout(View.java:8203)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
at android.view.View.requestLayout(View.java:8203)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:254)
at android.view.View.requestLayout(View.java:8203)
at android.view.View.setFlags(View.java:4579)
at android.view.View.setVisibility(View.java:3108)
at c.a(Unknown Source)
at c.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more
2011.03.30 16:02:22
음...setVisibility 말고도 UI 건드리는 소스는 다 핸들러를 통해 동작하도록 해놨습니다...
그정도는 살펴보면 해줄수 있는 부분이라고 생각되는데요...
혹시라도 살펴보다가 놓치거나 할수 있는 부분은 누구나 다 있을수 있다고 생각하고 그럴때 정확히 오류를 검증할 수 있는 방법이 있을거라 생각합니다.
윈도우 기반에서 개발할때 덤프로 추적을 한다던가 메모리에 break 포인터를 건다던가 등 방법이 있지요...
제가 안드로이드 기반에서 경험이 없다보니 그러한 방법이 궁굼했던 것입니다.
정확히 질문의 요점은 저런 Stack Trace가 왔을때 디버깅하는 좋은 방법이 있을까 입니다.
Monkey를 이용하여 이벤트 발생 시켜봤는데 노가다식의 스트레스 테스트는 별로 도움이 안됬었습니다...
Stack Trace를 추적할 수 있는 다른 좋은 방법이 없을까요?
그정도는 살펴보면 해줄수 있는 부분이라고 생각되는데요...
혹시라도 살펴보다가 놓치거나 할수 있는 부분은 누구나 다 있을수 있다고 생각하고 그럴때 정확히 오류를 검증할 수 있는 방법이 있을거라 생각합니다.
윈도우 기반에서 개발할때 덤프로 추적을 한다던가 메모리에 break 포인터를 건다던가 등 방법이 있지요...
제가 안드로이드 기반에서 경험이 없다보니 그러한 방법이 궁굼했던 것입니다.
정확히 질문의 요점은 저런 Stack Trace가 왔을때 디버깅하는 좋은 방법이 있을까 입니다.
Monkey를 이용하여 이벤트 발생 시켜봤는데 노가다식의 스트레스 테스트는 별로 도움이 안됬었습니다...
Stack Trace를 추적할 수 있는 다른 좋은 방법이 없을까요?



