안드로이드에서 static 변수의 사용

Posted on 2010. 11. 14. 03:14
Filed Under IT/안드로이드

안드로이드 앱 실행 중 화면의 가로세로 방향이 변하거나 하면 OnCreate가 다시 호출되게 되는데요. 문제는 이때 변수들이 초기화 된다는 거죠.

잘 실행하고 있던 애들이 폰 방향 한번 바꿨다고 초기화 되니 문제가 됩니다.

보통 액티비티에 이런 속성을 추가해서 문제를 해결하는데요.

android:configChanges="keyboardHidden|orientation"

이게 문제가 되는게 가로UI를 따로 지정하는 경우에 가로/세로UI가 바뀌질 않고 그냥 쭉 나와서 사람을 곤란하게 만듭니다.

그래서 저는 위의 속성을 주지 않고 값을 유지해야 하는 속성들을 static으로 많이 사용했는데요.(일일이 변수들을 저장해뒀다가 복원하는 과정이 무지하게 싫고 귀찮더만요...쩝) 당연히 액티비티가 종료되고 다시 시작하면 static변수들이 초기화 된다고 생각했습니다.

그.런.데. 한참 개발을 진행하고 있는데 안드로이드 2.2를 사용하는 폰들에게서 문제가 나타납니다. 분명히 종료하고 다시 실행했는데 객체들이 초기화가 되지 않고 남아있어서 오동작을 하고 앱이 맛이 갑니다.

그래서 찾아보니 안드로이드가 왠만해선 프로세스를 종료시키지 않고 찌꺼기를 자꾸 남긴답니다. 요렇게 찌꺼기로 나아 있는 static 변수들이 다음에 실행할때 초기화도 없이 다시 사용되는 겁니다.ㅠㅠ
2.1버전에서는 프로세스를 완전히 종료시키는 루틴이 동작해서 문제를 발견하지 못했는데,
2.2버전에서는 기존에 사용하던 프로세스 종료 루틴이 완전하게 동작을 하지 않아서 문제가 생겼습니다.

일단 문제 되는 static객체들은 수정을 했는데, 너무나 많은 곳에서 static을 사용하는 바람에 시한 폭탄처럼 수시로 문제가 발생하더군요.ㅎㅎ
테스트 꼼꼼히 진행하면서 문제가 되는 부분을 찾아내서 수정했지요.ㅋㅋ(힘들었습니다...)

static을 사용할 때는 항상 조심히, 신중히 사용합시다.ㅋ

참고로 static을 빼는 경우에는 아래와 같이 onSaveInstanceState에서 상태값을 저장하고 onRestoreInstanceState에서 저장된 값을 복원하는 방식으로 처리하면 됩니다.
    @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        outState.putInt(HOUR, m_nHourVal);
        outState.putInt(MIN, m_nMinVal);
        outState.putInt(SEC, m_nSecVal);

        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        m_nHourVal = savedInstanceState.getInt(HOUR);
        m_nMinVal = savedInstanceState.getInt(MIN);
        m_nSecVal = savedInstanceState.getInt(SEC);

        super.onRestoreInstanceState(savedInstanceState);
    }

 

그리고 static을 사용할 때는 액티비티나 앱이 종료될때 항상 static변수를 초기화 해줍시다.ㅎ

About

by 쏜다

Notice

Counter

· Total
:
· Today
:
· Yesterday
: