활동 클래스의 정적 필드는 생성/파괴주기를 오래 살리도록 보장됩니까?

StackOverflow https://stackoverflow.com/questions/1636500

문제

나는 활동의 여러 번의 호출 사이에 상태를 보존 해야하는 문제에 종종 발생합니다 (즉, 여러 oncreate ()/ondelete () 사이클을 통과하는 것). 불행히도, 안드로이드의 지원은 실제로 열악합니다.

상태를 보존하는 쉬운 방법으로 클래스는 클래스 로더에 의해 한 번만로드되기 때문에 정적 번들 필드의 활동의 여러 인스턴스간에 공유되는 임시 데이터를 저장하는 것이 안전하다고 생각했습니다.

그러나 때때로 인스턴스 A가 정적 번들을 생성하고 데이터를 저장 한 다음 파괴되고 인스턴스 B가 읽으려고 시도하면 정적 필드가 갑자기 무효화됩니다.

그렇다고 활동이 생성/파괴주기를 통과하는 동안 클래스가 클래스 로더에 의해 제거되고 다시로드되었음을 의미하지 않습니까? 다른 방법은 공전 이전에 물체를 참조하고있을 때 필드가 갑자기 무효화됩니까?

도움이 되었습니까?

해결책

이 답변의 첫 번째 부분은 정말로 오래되었습니다. 아래를 참조하십시오. 오른쪽 그것을하는 방법

응용 프로그램 개체를 사용하여 응용 프로그램 영구 개체를 저장할 수 있습니다. 이 안드로이드 FAQ 이 문제에 대해서도 이야기합니다.

이 같은:

public class MyApplication extends Application{
    private String thing = null;

    public String getThing(){
        return thing;
    }

    public void setThing( String thing ){
        this.thing = thing;
    }
}

public class MyActivity extends Activity {
    private MyApplication app;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        app = ((MyApplication)getApplication());

        String thing = app.getThing();
    }
}

그만큼 오른쪽 방법:

이 답변이 처음 작성되었을 때, 활동 라이프 사이클에 대한 문서는 지금만큼 좋지 않았습니다. 독서 활동 상태 저축 활동 문서의 섹션은 Android가 우리가 상태를 저장하기를 원하는 방법을 이해하는 데 도움이됩니다. 본질적으로, 활동이 시작되는 두 가지 상황이 있습니다 : (1) 새로운 활동으로서 및 (2) 구성 변경으로 인해 또는 메모리 압력으로 인해 파괴 된 후 재현 될 때. 활동이 새로운 활동이기 때문에 활동이 시작되면 SaveInstancestate는 NULL입니다. 그렇지 않으면 Null이 아닙니다. NULL이라면 활동이 처음부터 초기화해야합니다. 파편은 활동과 매우 유사 하며이 개념을 자세히 설명했습니다. ANDEVCON-14 슬라이드 데크. 당신은 또한 그것을 볼 수 있습니다 샘플 코드 자세한 내용은 내 ANDEVCON-14 프레젠테이션을 위해.

이전 예제를 재 작업하면 아래 코드와 비슷합니다. 나는 의미론을 조금 바꿉니다.이 두 번째 버전에서 나는 문자열을 가정합니다. thing 특정 내의 활동에만 해당됩니다 안드로이드 작업, 이전 예에서는 모호합니다. 여러 안드로이드 작업에 대해 동일한 데이터를 유지하려는 경우 애플리케이션 객체 또는 다른 싱글 톤을 사용하는 것이 여전히 최선의 방법입니다.

public class MyActivity extends Activity {
    private static final String THING = "THING";

    private String thing;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState==null) {
            // First time here (since we last backed out at least)
            thing = initializeThing(); // somehow we init it
        } else {
            // Rehydrate this new instance of the Activity
            thing = savedInstanceState.getString(THING);
        }

        String thing = app.getThing();
    }

    protected void onSaveInstanceState(Bundle outState) {
        outState.putString(THING, thing);
    }
}

다른 팁

정적 데이터를 유지하는 다른 하나는 악한 방법으로 활동이 싱글 톤 클래스를 회전시키는 것입니다. 이 싱글 톤은 그 자체에 대한 정적 참조를 유지합니다.

class EvilSingleton{
    private static EvilSingleton instance;

    //put your data as non static variables here

    public static EvilSingleton getInstance()
    {
        if(instance == null)
            instance = new EvilSingleton();
        return instance;
    }
}

활동의 oncreate () 메소드에서 싱글 톤 및 필요한 데이터에 액세스/빌드 할 수 있습니다. 이렇게하면 활동이나 응용 프로그램이 여러 번 파괴되거나 재현 될 수 있으며 프로세스의 메모리 공간이 보존되는 한 ~해야 한다 괜찮습니다.

이것은 사악한 파괴적인 해킹이므로 약속은 없습니다 ;-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top