2015-01-19 3 views
-3

AsyncTask() 각 세 개를 실행 중입니다. 다른 클래스의 개체를 만듭니다. 이것은 내가 doInBackground()에서 클래스의 인스턴스를 생성하고 어떻게클래스의 새 인스턴스를 만들 때 내 ArrayList 데이터가 소멸되지 않습니다.

지금

 DOM domObject = new DOM; 

는 내 DOM 클래스

public class DOM { 
    public static ArrayList<HashMap<String, Object>> tempNewsArray = new ArrayList<>(); 

내 주요 클래스 실행 세 AysncTask 클래스 수준 ArrayList을가 객체이므로 AsyncTask 각각에 대해 DOM 클래스의 세 인스턴스가 만들어 져야합니다.

AsyncTask을 실행할 때마다 데이터가 ArrayList에 추가됩니다.

예 : 처음으로 AsynTask 실행 됨, 일부 데이터는 ArrayList에 추가되었습니다. 는 AsyncTask 실행 둘째, 일부 데이터 (이전 데이터 ArrayList 거기 안)

ArrayList에 추가 그러나 문제는 DOM 클래스의 이전 인스턴스에서 데이터가 ArrayList 거기에 아직 제거되지, 때 새로운 DOM 클래스의 인스턴스는 또 다른 AysnTask instace에 의해 생성됩니다.

왜 이런 일이 발생합니까?

예는 제 Asynctask 의해 생성 DOM 클래스 첫번째 인스턴스는 일부 데이터 ArrayList를 첨가한다.

두 번째 인스턴스 DOM 클래스의이 두 번째 Asynctask 인스턴스에 의해 생성되고, 일부 새로운 데이터가 ArrayList에 추가되지만 이전 인스턴스에서 이전 데이터가 아직도있다.

왜 그렇습니까?

+0

DOM''의 모든 인스턴스가 같은'tempNewsArray를 사용하는 것이 의미하는'tempNewsArray'은'static' ' – Titus

+0

하지만 이걸 좋아한다면'public static ArrayList > tempNewsArray' 그리고'new ArrayList <>();와 같은 다른 메소드 안에 인스턴스를 생성하면 이전의 데이터 DOM 인스턴스가 없습니다. 왜'ArrayList'가 여전히'정적 인 '이래로이 행동을합니다. – Joe

답변

2

tempNewsArray은 정적이므로 모든 Dom isntances는 해당 구성원의 단일 사본을 공유하며 Dom 클래스가 초기화 될 때 단 한 번만 초기화됩니다.

당신은 자신의 ArrayList의 멤버를 가지고 선언을 변경하려면 각 Dom 인스턴스를하고자하는 경우 :

public ArrayList<HashMap<String, Object>> tempNewsArray = new ArrayList<>(); 
+0

하지만 내가'public static ArrayList > tempNewsArray'를 좋아한다면'new ArrayList <>();와 같은 다른 메소드 안에 그 인스턴스를 생성 한 다음 이전의' DOM' 인스턴스가 없습니다. 왜'ArrayList'가 여전히'정적 인 '이래로이 행동을합니다. – Joe

+0

@Joe 'tempNewsArray' 참조에 새로운 ArrayList 객체를 할당하여 덮어 쓰면 이전 ArrayList 객체는 더 이상 해당 정적 변수에 의해 참조되지 않지만'tempNewsArray '멤버가 하나만 있다는 사실은 변경되지 않습니다 모든 인스턴스가 공유합니다. 정적 초기화 표현식 (또는 정적 이니셜 라이저 블록)에서 정적 멤버를 초기화하면 해당 멤버가 한 번만 초기화됩니다. – Eran

관련 문제