Android 애플리케이션 클래스를 사용하여 데이터 유지 내 결과에 따르면 Application 클래스는

나는 응용 프로그램에 대해 다소 많은 양의 데이터가 필요한 상당히 복잡한 Android 응용 프로그램을 작업하고 있습니다 (총 약 500KB라고 말하고 싶습니다-모바일 장치의 경우이 크기입니까?). 내가 알 수 있듯이, 응용 프로그램의 모든 방향 변경 (보다 정확하게는 활동에서)은 활동의 완전한 파괴 및 재생성을 유발합니다. 내 결과에 따르면 Application 클래스는 동일한 수명주기를 갖지 않습니다 (즉, 모든 의도와 목적을 위해 항상 인스턴스화 됨). 애플리케이션 클래스 내부에 상태 정보를 저장 한 다음 Activity에서 참조하는 것이 합리적입니까? 아니면 일반적으로 모바일 장치의 메모리 제약으로 인해 “허용되는”방법이 아닌가? 이 주제에 대한 조언을 정말 감사합니다. 감사!



답변

나는 500kb가 그렇게 큰 거래가 될 것이라고 생각하지 않습니다.

설명하신 내용은 활동에서 데이터를 잃는 문제를 정확히 어떻게 해결했는지에 대한 것입니다. Application 클래스에서 글로벌 싱글 톤을 생성하고 내가 사용한 활동에서 액세스 할 수있었습니다.

많이 사용될 경우 Global Singleton에서 데이터를 전달할 수 있습니다.

public class YourApplication extends Application
{
     public SomeDataClass data = new SomeDataClass();
}

그런 다음 모든 활동에서 다음과 같이 호출하십시오.

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

여기 내 블로그 게시물 “Global Singleton”섹션 에서 논의합니다 .


답변

Application인스턴스 에 의존하는 사람들 은 잘못되었습니다. 처음 Application에는 전체 앱 프로세스가 존재 하는 한 존재하는 것처럼 보일 수 있지만 이것은 잘못된 가정입니다.

OS는 필요에 따라 프로세스를 종료 할 수 있습니다. 모든 프로세스는 문서에 지정된 5 단계의 “killability”로 나뉩니다 .

예를 들어 사용자가 수신 전화에 응답하여 앱이 백그라운드로 전환되면 RAM 상태에 따라 OS가 프로세스를 종료 (또는 프로세스의 Application인스턴스 파괴 ) 할 수 있습니다. .

더 나은 접근 방식은 데이터를 내부 저장소 파일에 저장 한 다음 활동이 재개 될 때 읽는 것입니다.

최신 정보:

부정적인 피드백을 많이 받았으므로 설명을 추가 할 때입니다. 🙂 글쎄, 처음에는 상태가 앱에 정말 중요하다는 잘못된 가정을 실제로 사용했습니다. 앱이 때때로 상태가 손실되는 것을 확인하는 경우 그러나 (그냥 다시 읽기 / 다시 다운로드됩니다 일부 이미지 수),의 구성원으로 유지하기 위해 완전히 OK입니다 Application.


답변

활동 외부의 “Global Singleton”에 액세스하고 싶고 Context관련된 모든 개체를 통과 하여 단일 항목을 얻지 않으려면 응용 프로그램 클래스에 정적 속성을 정의하기 만하면됩니다. 그 자체. onCreate()메소드 에서 속성을 초기화하십시오 .

예를 들면 :

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

의 서브 클래스 Application도 리소스를 얻을 수 있으므로 다음과 같이 리소스를 반환하는 정적 메서드를 정의 할 때 간단히 액세스 할 수 있습니다.

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

그러나 메모리 누수방지 하기 위해 컨텍스트 참조를 전달할 때 매우주의 해야합니다 .


답변

데이브, 어떤 종류의 데이터입니까? 애플리케이션 전체와 관련된 일반 데이터 (예 : 사용자 데이터) 인 경우 Application 클래스를 확장하여 여기에 저장합니다. 데이터가 활동과 관련된 경우 화면 회전시 데이터를 유지하려면 onSaveInstanceState 및 onRestoreInstanceState 핸들러를 사용해야합니다.


답변

실제로 방향 기능을 재정 의하여 활동이 파괴되고 다시 생성되지 않도록 할 수 있습니다. 봐 여기 .


답변

응용 프로그램 클래스를 만들고 응용 프로그램의 어디서나 사용할 수 있도록 해당 calss에 모든 데이터를 저장할 수 있습니다.


답변

이것이 매우 오래된 질문이라는 것을 알고 있지만 jetpack 구성 요소ViewModel을 사용하는 것이 활동 회전 사이에 데이터를 보존하는 가장 좋은 방법입니다.

ViewModel 클래스는 수명주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었습니다. ViewModel 클래스를 사용하면 데이터가 화면 회전과 같은 구성 변경에서 살아남을 수 있습니다.