2010-12-17 5 views
5

일부 탭이있는 탭 호스트가 있으며 각 탭은 사용자가 탭 호스트에서 처음 입력 할 때마다 원격 데이터베이스에서 모든 데이터를 다시로드해야하기 때문에 onresume 메소드를 구현했습니다.tabhost의 탭을 처음 열 때 onResume이 호출되는 이유는 무엇입니까?

괜찮 았지 만 문제는 사용자가 처음 탭을 열면 onCreate 및 onResume의 두 메서드가 호출되면서 내 응용 프로그램이 두 번 데이터베이스에 연결되어 정보를 검색하는 것입니다 .... 나는 오직 tabhost에 사용자가 처음으로 입력 할 때 생성해야합니다.

이 희귀 한 문제를 피하는 방법은 무엇입니까?

답변

14

Activity lifecycle docs에서 설명한 것처럼 onCreate와 onResume은 항상 처음으로 활동이 시작될 때 호출됩니다. Activity로 돌아 가면 적어도 onResume이 호출되지만 Android가 리소스를 확보해야 할 경우 onCreate가 다시 호출 될 수 있습니다.

활동으로 돌아갈 때마다 설정이 필요하면 왜 논리를 onResume에 넣을뿐만 아니라?

+0

롤, 좋은 생각, onresume은 항상 처음이라고합니다 ...... 그렇다면 나는 oncreat를 채울 필요가 없습니다 !!! – NullPointerException

+0

woooooooooow 작품! 고마워요! – NullPointerException

+0

btw 당신은 onresume이 항상 처음으로 활동이 만들어 지도록 100 % 확신합니까? – NullPointerException

0

탭의 콘텐츠는 활동이므로 앱을 시작할 때 둘 다 생성 (및 다시 시작)해야합니다.

이 문제를 방지하는 한 가지 방법은 활동 대신보기를 탭 콘텐츠로 사용하는 것입니다. 이렇게하면 1 개의 활동 (TabActivity) 만 있기 때문에 1 onCreate() 방법이 있습니다.

+0

를 같은 것을 한 것은, 내가 코드를 다시 할 수없는, 그것은 다른 해결책이 존재하지 않는 코드 – NullPointerException

+0

의 많은입니까? – NullPointerException

0

다른 포스터에 동의하여 앱을 다시 고려해야합니다. 독립 실행 형 활동을 탭에 넣고 모든 것이 의미가 있다고 기대할 수는 없습니다.

이렇게 말하면 DB를 초기화해야하는지 여부를 나타내는 플래그를 어딘가에 가질 수 있습니다. , 나는 내 응용 프로그램 활동으로 설계 한 각 활동의 onResume()에서, 당신은 나에게 불가능

synchronized (MyLock.class) { 
    if (!initialized) { 
     initDb(); 
     MyLock.initialized = true; 
    } 
}