2014-10-01 1 views
0

부모 응용 프로그램의 onCreate() 호출 후 화면을 회전 할 때 잘 작동하는 유지 된 조각이 있습니다.응용 프로그램으로 돌아갈 때 보존 된 조각이 올바르게 작동하지 않습니다.

그러나 응용 프로그램을 종료하고 돌아 오는 순간 (예 : 홈 화면으로 이동 한 다음 내 응용 프로그램으로 돌아가는 등) 조각이 제대로 작동하지 않는 것 같습니다.

본질적으로 어떤 일이 일어나고 있는지는 내 활동으로 돌아올 때마다 조각이 어떤 식 으로든 '재설정'된 것처럼 보입니다. 이것은 조각 트랜잭션과 관련이 있습니까? Log.d 마지막 호출에


()는 gameFragment.testValue가 null을 반환 - 방법이 발생합니까? 값을 설정하는 유일한 장소는 이전 조건 블록입니다. 그 값을 설정하지 않고 어떻게 조각을 만들 것입니까? Log.d 마지막 호출에

 gameFragment = (GameFragment)fragmentManager.findFragmentByTag("gameFragment"); 


    if (gameFragment == null) 
    { 
     gameFragment = new GameFragment(); 
     gameFragment.setRetainInstance(true); 

     gameFragment.testValue = new Random().nextInt(1000); 
     Log.d("hmm", " after set test value:" +gameFragment.testValue); 

     fragmentManager.beginTransaction().add(gameFragment, "gameFragment").commit(); 
     fragmentManager.executePendingTransactions(); 

     gameFragment.testValue = new Random().nextInt(1000); 
     Log.d("hmm", " after commit, after set test value:" +gameFragment.testValue); 
    } 
    else 
    { 
     Log.d("hmm", "test value:" +gameFragment.testValue); 
    } 
+1

은 아마 당신의 조각이 장면 뒤에 다시 가져옵니다

뭔가 논문을 지원합니다. 앱을 통해 디버깅하고 GameFragment 생성자에 브레이크 포인트 설정을 시도하여 확인을 위해 생성자 내에 디버그 정보 로그를 넣거나 확인하십시오. EDIT : Fragment.instantate를 통해 조각을 만들 때 기본 생성자가 사용됩니다. –

+0

나는 그것이 재현되는 것에 동의 할 것이다. 하지만 어떻게 될까요? 지금 디버깅을 시도하겠습니다. –

+0

앱이 파괴되었을 수 있습니다. 조각이 실제로 유지되었는지 확인할 수 있습니까? – uDevel

답변

2

documentation 공용 빈 생성자를 포함해야 조각의

모든 서브 클래스를 찾을 수 있습니다. 프레임 워크는 필요에 따라 조각 클래스를 다시 인스턴스화하는 경우가 많으며 특히 상태 복원 중에 이 발생하므로이 생성자를 찾아 인스턴스를 생성 할 수 있어야합니다. 빈 생성자가 이 아닌 경우 상태 복원 중 런타임 예외가 일부 경우에 발생합니다. 이런 식으로, 안드로이드는 조각을 재현 때 이전 값에 PARAMS을 설정할 수 있습니다 -

setArguments 방법 및 번들을 통해 매개 변수를 설정하는 것이 좋습니다. 기본 생성자를 사용하여 응용 프로그램을 떠날 후 http://developer.android.com/reference/android/app/Fragment.html#setArguments(android.os.Bundle)

+0

그래서 보존 된 조각은 '구성 변경'을 위해서만 작동합니까? 이것은 너무 불필요하게 제한하는 것처럼 보입니다. 어떤 대안이 있습니까? SoundPool/MediaPlayer 같은 객체에 대한 참조를 유지하고 싶습니다.이 객체는 쉽게 '직렬화 할 수 없습니다'. –

+0

사용 사례가 무엇인지 잘 모르겠지만 SoundPool 또는 MediaPlayer에 대한 참조를 유지하는 것이 Service for Service 사용에 대해 좀 더 자세히 살펴 보는 것과 같습니다. –

+1

@Chris : "SoundPool/MediaPlayer 같은 객체에 대한 참조는 쉽게 직렬화 할 수 없습니다."- 프로세스가 종료되면 불가능합니다. 대신, 나중에 MediaPlayer 나 SoundPool을 재현 할 수 있도록 세부 사항을 유지해야합니다. "서비스를 사용하는 방법에 대해 살펴보아야합니다."- 미디어 재생을 위해 '서비스'를 사용하는 것은 의미가 있습니다. 앱이 백그라운드에있을 때 재생해야한다면 서비스를 사용하여 조금 더 긴 프로세스는 사용자에게 적대적이며 엉성한 행위입니다. – CommonsWare

1

()는 gameFragment.testValue가 null을 반환 - 방법이 발생합니까?

하나의 가능성은 프로세스가 종료 된 것입니다. 안드로이드는 인자가없는 public 생성자를 사용하여 프래그먼트를 다시 만들고, savedInstanceStateBundle을 줄 것이다. 그러나 "유지 된 단편"의 "보유"부분은 구성 변경에만 해당되므로 해당 수단만으로 유지되는 모든 항목이 손실됩니다. 확인

+0

@Chris : 엄밀히 말하면, 관련이 없습니다. 안드로이드가 활동을 즉시 파기하지 않을 경우 (예 :'onPause()'와 같은) 활동이 백그라운드로 들어가기 전쯤에'onSaveInstanceStated()'로 호출 될 것입니다. 예 : HOME, BACK이 아님). 제공된 'Bundle'에 상태를 저장할 수 있습니다.해당 번들은 구성 변경으로 인해 활동이 파괴되어 다시 생성 된 경우 * 귀하의 프로세스가 종료되고 * 귀하의 앱이 최근 작업 목록에 여전히 * 있거나 * 귀하에게 다시 전달됩니다. – CommonsWare

+0

사과 귀하의 회신을보기 전에 제 의견을 삭제했습니다. Bundle 인스턴스가 어떤 메소드를 참조하는지 (어떤 메소드인지) 알지 못했습니다. –

관련 문제