마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

탭 호스트 resume 시 exception 발생

0 추천
이번에 뮤직플레이어를 구상중인 학생 입니다.

탭 호스트에 리스트뷰를 3개 연동 시켰는데요.

탭 호스트에서 다른 activity을 들어갔다가 탭 호스트로  back을 하면 exception 이 발생하는데 의심가는 이유 있으신지요?

고수님들의 도움 기다리고 있겠습니다. ㅜㅜ

필요하시다면 소스 첨부해드리겠습니다.
RoAInNa (240 포인트) 님이 2014년 2월 21일 질문
로그캣이 있다면 정확한 오류내용을 보고 답해드릴수잇을것같은데,

이것만 보고는 어떤 문제인지 짐작이 잘 안가네요 ㅠㅠ
02-21 13:33:47.102: E/AndroidRuntime(29525): FATAL EXCEPTION: main
02-21 13:33:47.102: E/AndroidRuntime(29525): java.lang.RuntimeException: Unable to resume activity {kr.jigtop.musicplayer/kr.jigtop.musicplayer.HostTabActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2588)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2616)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1245)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.os.Looper.loop(Looper.java:137)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityThread.main(ActivityThread.java:4863)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at java.lang.reflect.Method.invokeNative(Native Method)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at java.lang.reflect.Method.invoke(Method.java:511)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at dalvik.system.NativeStart.main(Native Method)
02-21 13:33:47.102: E/AndroidRuntime(29525): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:133)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.database.CursorWrapper.requery(CursorWrapper.java:186)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.Activity.performRestart(Activity.java:5272)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityThread.performRestartActivity(ActivityThread.java:3070)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:168)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.LocalActivityManager.dispatchResume(LocalActivityManager.java:523)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityGroup.onResume(ActivityGroup.java:61)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1187)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.Activity.performResume(Activity.java:5306)
02-21 13:33:47.102: E/AndroidRuntime(29525):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2578)
02-21 13:33:47.102: E/AndroidRuntime(29525):     ... 10 more
 

이렇게 나오는군요 필요하시다면 소스파일도 올리겠습니다.
android.database.StaleDataException: Attempted to access a cursor after it has been closed.
이네요.. DB관련 부분에서 찾아보세요

1개의 답변

+1 추천
 
채택된 답변

에러 내용은 

android.database.StaleDataException: Attempted to access a cursor after it has been closed.

ㅇㅣ고 커서를 닫은뒤에 다시 쿼리를 날렸다는 내용같습니다.

 

http://jepo.tistory.com/126

를 먼저 참고해보시구요.

 

 

 

위 블로그에 적힌 이유도 있겠지만, 저도 이 에러 몇번 겪어봤는데..

Cursor를 사용하여 DB를 불러오시는지요?

 

이때 다 불러오시고 Cursor를 close(); 하시겠죠?

하지만..이때 제가 겪어본 바로는,

(아이스크림 샌드위치 OS 이상 버전에서)

cursor를 close()하고 다시 onResume()으로

Activity가 불려오면서 cursor가 다시 사용되면 위와 같은 충돌이 일어나면서 튕겼던 적이 있었습니다.

(왜 그런지는 아직도 잘 모르겠는데요..분명히 커서를 닫고.. onResume에서 다시 사용되는 커서는 새 커서일텐데..)

 

어쨋든 저는 cursor를 전역변수로 선언하고 커서를 다 사용해도 close(); 하지 않았고,

액티비티가 완전히 종료되는 

onDestroy() 안에 

if(!cursor.isClose())
    cursor.close();

를 추가해서 해결한적이 있습니다.

 

다른문제일 수도 있겠네요..

 

안드로이드로우 (15,740 포인트) 님이 2014년 2월 21일 답변
RoAInNa님이 2014년 2월 22일 채택됨
답변해주셔서 정말 감사합니다. ^^
 mediastore을 사용하다보니 커서에 문제가생긴것 같습니다.
저도 같은 문제여서.. RoAlnNa님의 멘트를 힘입어 검색해서 해결했습니다.


Mediastore를 사용할때 managedQuery()함수를 이용하는 경우가 있는데.
managedQuery()함수는 왕왕돼지님의 자료에 의하면 아래와 같습니다.
http://aroundck.tistory.com/126

managedQuery() = ContentResolver.query() + startManagingCursor( Cursor ) 입니다.
  
여기서 startManagingCursor( Cursor ) 가 하는 일은,
activity가 pause 될 때, 이 cursor에 deactivate() 작업을 해주어 메모리 손실을 줄여주고,
activity가 resume 될 때, requery() 를 해주어 원래의 내용이 들어가도록 해주는 것이죠.
activity가 destroy될 때는 마찬가지로 close() 까지 해주는 좋은 manager입니다.


내부적 코드로 인해서 어플리케이션 에러코드도 찾을 수 없는겁니다...
...