4개의 페이지로 구성된 간답한 앱을 만들었는데 처음 실행해서 기본적인 사용을 하는데는 전혀 문제가 없답니다.
단지 앱을 실행한 후 홈 화면으로 이동 하고 휴대폰을 끈다음 몇시간 지나서 다시 앱을 실행할 경우 백그라운드에 실행된 앱이 다시 포그라운드로 올라오는데 이때 MainActivity 에서 각각의 Fragment 로 값을 전달하면 먹통이 되더군요.
디버깅이 정말 힘든건 이 현상이 매번 일어나는게 아니라 백그라운드에 오랬동안 방치 했다가 실행할때 가끔식 생긴다는 거에요. 그리고 구형 폰에서는 오히려 이런 현상이 없는데 신형 겔럭시 폰에서는 자주 발생 하고요.
제 예상에는 백그라운드에 오래 방치된 앱의 경우 OS에 의해서 Fragment 라이프 사이클에 어떤 일이 발생 되는데 제가 이 부분을 잘 모르고 코딩하고 있는거라 예상됩니다.
기본적인 코드 구성은 아래와 같습니다. 문제가 되는 부분은 백그라운드에 오랫동안 있다가 포그라운드로 돌아왔을때 dataChange() 함수를 호출해도 각 Fragment 의 UI가 새로고침 되지 않는것 입니다. 평상시에는 전혀 문제 없이 작동 합니다. 백그라운드에 1시간 이상 방치 되었다가 포그라운드로 돌아 왔을때 50% 정도의 확율로 발생 됩니다.
아래와 같은 코드 구성은 근본적인 문제가 있는걸까요?
public class MainActivity extends AppCompatActivity {
private TubeFragment mFragment0;
private TubeFragment mFragment1;
private TubeFragment mFragment2;
private TubeFragment mFragment3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragment0 = Fragment.newInstance();
mFragment1 = Fragment.newInstance();
mFragment2 = Fragment.newInstance();
mFragment3 = Fragment.newInstance();
}
private void dataChange() {
mFragment0.change(data);
mFragment1.change(data);
mFragment2.change(data);
mFragment3.change(data);
}
private class MyPagerAdapter extends FragmentPagerAdapter {
MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 4;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0: return mFragment0;
case 1: return mFragment1;
case 2: return mFragment2;
case 3: return mFragment3;
}
return null;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
}
}