2013-03-25 2 views
1

Android 액티비티에서는 해당 액티비티에서 정적으로 선언 된 ArrayList를 채 웁니다. 이 데이터 구조는 나중에 응용 프로그램을 실행하는 동안 다른 활동에 의해 다음과 같이 액세스됩니다.Android 액티비티의 정적 ArrayList

ClassName.data_structure_name;

내 질문은 안드로이드가 메모리 구조 등을 지울 수 있다면 그렇게하는 것이 안전할까요?

답변

1

예, Android는 을 here과 같이 처분 할 수 있습니다. 활동이 중지되거나 중단되면

시스템 (ITS 완료() 메소드를 호출)를 완료하도록 요청하여 하나 메모리에서 드롭하거나 단순히 그 프로세스를 죽이는. ( 이 완료 또는 사망 후) 활동이 다시 열릴 때, 모든

그러나Activity인스턴스을위한 이상 작성해야합니다. ArrayList이 정적이라면 Activity 클래스가 Dalvik VM에서 언로드되지 않는 한 삭제되지 않습니다 (개인적으로는 이런 일이 발생하지 않았 음).

어쨌든, IMHO 디자인이 좋지 않습니다. (예전에 사용했습니다.) 별도의 클래스를 사용하여 정적 인 ArrayList을 저장하는 것이 좋습니다. 멀티 스레딩 및 the consof using Singletons을 조심하십시오.

Thisthis 다음 질문도 가치가 있습니다.

0

데이터가 다른 프로세스에서 유지되지 않을 수도 있습니다. 궁금한 점이 있다면 오류가 발생할 수 있습니다. IE는 클래스의 정적 멤버가 영구 저장소가 아닙니다.

그러나 나중에 이러한 활동이 동일한 프로세스 내에 있으면 지정된 것처럼 액세스 할 수 있습니다.

+0

여기에 질문하는 것이 아닙니다. – m0skit0

1

다른 액티비티가 ArrayList에 액세스해야하는 경우 액티비티가 아닌 별도의 클래스에 배치해야한다고 생각합니다.

0

이 디자인과 관련된 몇 가지 문제가 있습니다. 또한 MVC 디자인 패턴의 규칙을 깨고있다

  • 활동이 필요하지 않은 경우 소프트웨어 공학 및 OOP의

    1. 실연 규칙은
    2. 그것은 당신이에서 데이터를 가져 오는 것 같아요 메모리를

    을 차지합니다 어떤 소스와 배열 목록에 넣어. 전체 배열 목록이 필요하지 않은 경우 값을 번들 내부로 전달하십시오.

    후속 작업에서 전체 배열 목록이 필요한 경우 배열 목록을 처음으로 가져 오는 방식으로 다시 채워 넣으십시오.

    정적 액세스는 OOP 디자인과 잘 어울리지 않습니다. 다음과 같은 경우를 제외하고 로그 태그 인쇄 안드로이드 애플 리케이션의 정적 어디서나 사용하지 않습니다.

    public static final String TAG="MY_TAG"; 
    

    심지어 싱글 톤은 논쟁의 여지가 있습니다.

  • +0

    전체 배열이 필요합니다. 당신은 웹 서버에 새로운 요청을하고 배열을 repopule하도록 제안하고 있습니까?! 데이터 트래픽이 많을수록 사용자를 기다리는 시간이 길어집니다. 좋은 생각이 아닌 것 같습니다. – notGeek

    +0

    웹 소스에서 가져 오는 경우 시간과 함께 지속성 저장소를 사용하여 내부적으로 캐시합니다. 저장된 시간과 비교할 때마다 데이터를 읽습니다. 너무 오래되면 웹 서버에서 데이터를 다시 가져 와서 시간과 데이터를 업데이트하십시오. 네트워크 작업에 비 UI 스레드를 사용한다고 가정합니다. 웹 서버에 대한 요청을 할 때마다 이전 요청이 보류 중인지 확인하십시오. 예를 들어 사용자가 화면을 회전 할 때마다 요청이 onCreate 인 경우 새로운 요청을하게됩니다. – minhaz

    +0

    * "활동이 필요하지 않으면 메모리를 차지합니다"* - 거짓, ** 정적 ** 멤버입니다. 그리고 당신은'TAG' 선언에서'final'을 잊었습니다.) – m0skit0