2012-04-14 3 views
1

AsyncTask를 사용하여 일부 데이터를 다운로드하여 데이터베이스에 저장하는 활동이 있습니다. 데이터베이스를 열기 위해서는 Context param을 SQLiteOpenHelper의 onCreate 메소드에 전달해야합니다. 즉, 데이터베이스는 어떻게 든 문맥을 필요로합니다.Android에서 활동을 재 작성하는 동안 DatabaseHelper로 작업하십시오.

그리고 궁금한 점이 있습니다. 기기가 돌아서 활동이 파괴되고 순환을 만들면 어떻게 될까요? 액티비티의 onCreate() 메소드보다는 액티비티의 생성자에서 데이터베이스를 열어도 될까요?

문제

내가 다른 스레드에서 DB를 사용하는 것이 내가 활동이 파괴

+0

당신이들의 OnDestroy() 메소드를 오버라이드 (override) 여기 DB 객체를 닫아야합니다 : 여기

는 링크입니다. –

+0

하지만 이렇게하면 다운로드 한 데이터를 데이터베이스에 저장해야하는 백그라운드 스레드가 중단됩니다. 그 일을 마치고 DB를 닫을 수있는 방법이 있습니까? – renal

답변

1

하나 개의 솔루션은 ActivityContext 대신의 ApplicationContext를 사용하는 것입니다 재현 될 때 정확히 무슨 일이 일어날 지 알고 싶어요. Application 생성자에서 ApplicationContext를 요청하는 정적 메서드 만 있으면됩니다.

컨텍스트에 액세스하는 데 일종의 싱글 톤을 사용하면 동시성에 아무런 문제가 없습니다. 여기

참조 예 : http://androidcookbook.com/Recipe.seam?recipeId=1218

또 다른 방법은 오픈 데이터베이스 연결을 추적하는 LoaderManager을 사용하는 것입니다.

여기를 참조하십시오 : http://developer.android.com/reference/android/app/LoaderManager.html

LoaderManager 아래 안드로이드 1.5

마이클

에 대한 호환성 패키지로 제공된다 (너무 완벽한 예입니다)
+0

감사합니다, 마이클! 나는 그것이 내가 찾고 있었던 것이 겠지. 죄송합니다. 투표하실 수 없습니다 – renal

+0

환영합니다 ;-) –

1

는 Incase의 일부 DB를하고 싶어 백그라운드에서 작업. 당신은 "Sevices"를 사용해야합니다. 서비스는 백그라운드에서 장기 실행 작업을 수행 할 수 있습니다. http://developer.android.com/guide/topics/fundamentals/services.html

+0

답변 해 주셔서 감사합니다! 서비스는 좋지만 내 스레드는 활동이있을 때 통신해야하므로 AsyncTask가 더 적합하다고 생각합니다. – renal

관련 문제