2013-04-12 3 views
19

오랫동안 백그라운드에서 유휴 상태가 된 후 응용 프로그램이 충돌합니다. 내가 디버깅을했고, 그것이 부서지는 이유가 NullPointerException에 기인한다는 것을 발견했다. 예외는 애플리케이션이 배경에있을 때 가비지 컬렉터에 의해 애플리케이션 싱글 톤 클래스의 데이터가 파괴된다는 사실 때문이었습니다. 내 응용 프로그램을 통해 각 활동에서 정적 데이터를 사용하고 있습니다.오랜 시간이 지나면 배경에서 복원 할 때 응용 프로그램이 손상됩니다.

제 질문은 : 백그라운드에서 응용 프로그램 클래스의 데이터를 영구히 유지할 수있는 방법이 있습니까? 아니면 다른 해결책이 있습니까?

+0

이 http://developer.android()를 참조 onResume의) 이동 중지 (에가는 이유는 그게 전부입니다 파일이 없습니다. co.kr/reference/android/app/Activity.html # onSaveInstanceState (android.os.Bundle) –

답변

13

더 정확한 답변을 원하면 여기에 코드를 입력하십시오. On, 안드로이드 메모리는 제한적이므로 VM은 불필요하다고 생각되는 코드를 제거 할 수 있습니다.

Activity life-cycle 방법, 특히 onResume을 살펴보고 완벽하게 이해했는지 확인하십시오. Activity 라이프 사이클 메소드를 적절하게 사용하지 않는 경우가 많아 응용 프로그램이 너무 많이 충돌합니다.

Activity에 대한 또 다른 중요한 고려 사항은 지속성 데이터에 어떤 문제가 발생했는지에 관계없이 Activity가 기본값을 사용하여 UI를 표시해야한다는 것입니다. 그래서 가정은 다음과 같습니다. 데이터가있는 경우 표시하지 않으면 실제로 처리하지 않습니다.. 사용자의 UI가 데이터가 있거나 없으면 절대로 충돌해서는 안됩니다.. 일부 기본값 또는 레이아웃에 저장하는 데 String.xml을 사용할 수 있습니다.

여전히 싱글 톤 클래스로 가고 싶다면 완벽하게 괜찮지 만 싱글 톤에 액세스하려고 할 때마다 다음과 같은 확인을해야합니다.

if (instance==null) 
    instance=Singleton.getInstance() 

당신의 getInstance() 방법뿐만 아니라 그것은 또한 모든 객체와 인스턴스 방법으로 변수

  • 다른 싱글 방법을 초기화해야합니다

    • 것을 만들 것입니다 당신에게 현재 인스턴스를 반환

    마 한 활동에서 다른 활동으로 정적으로 데이터에 액세스하지 않습니다. 당신이 지금 직면하고있는 타입 문제에 대해서 안드로이드를 위해서 특별히 좋지는 않습니다. 또한 그것은 좋은 OOP 프로그래밍 연습이 아닙니다.

    SharedPreference은 요구 사항을 충족하는 경우 데이터를 유지하는 좋은 방법입니다.

    Activity, Service 또는 BroadcastReciever와 같은 다른 Android 구성 요소의 데이터를 전달하려면 해당 데이터를 묶음 안에 넣고 인 텐트로 보낼 수 있습니다. 항상 SQLLite 데이터 저장을 자신이기 때문에 그리고, IO 등 등

  • +0

    답변 해 주셔서 고맙습니다. 매우 정확하게 설명하셨습니다. –

    +1

    +1 "사용자의 UI가 데이터 유무에 관계없이 절대로 충돌해서는 안됩니다." – OneThreeSeven

    2

    데이터를 저장하는 여러 가지 방법이 있습니다. 작은 것이면 SharedPreferences을 사용할 수 있습니다. 그렇지 않으면 아마 SQL 데이터베이스?

    체크 아웃 문제의이 종류를 일으키는 응용 프로그램에서 정적 변수의 사용을 피하는 http://developer.android.com/guide/topics/data/data-storage.html

    0

    시도합니다. 공유 환경 설정에 데이터를 저장하고 사용하십시오.

    1

    가능한 경우 다른 방법으로 저장하십시오. 복잡한 데이터 구조 인 경우 앱을 다시 시작해야 할 수 있습니다. 예를 들어 내 응용 프로그램에 내 서버에 대한 로그인 정보를 보유하는 사용자 싱글 톤이 있습니다. 나는 많은 데이터가 AWS 변수에 숨겨져있는 경우이를 저장하지 못했습니다. 우리가해야 할 일은 정리 된 후 (다시 시작하는 것과는 대조적으로) 홈 페이지에서 다시 시작할 때 감지하고 시작 활동을 시작한 다음 현재 활동을 마쳤습니다. 그리고 그것을 내 앱의 모든 활동에 추가해야했습니다.

    +3

    어떻게 감지 했습니까? – AlvaroSantisteban

    0

    활동이 더 이상 보이지 대신

    관련 문제