2

: 나는이 코딩 할 때 내가 기대 그래서포인터와 가비지 컬렉션

loadedImageDraggable.setBitmap(bitmap); 
Log.v(TAG, "recycled image1 :"+bitmap); 
Log.v(TAG, "recycled image2 :"+loadedImageDraggable.getBitmap()); 
bitmap.recycle(); 
bitmap = null; 
Log.v(TAG, "recycled image3 :"+bitmap); 
Log.v(TAG, "recycled image4 :"+loadedImageDraggable.getBitmap()); 

, 비트 맵 객체가 메모리에서 제거 얻을 것입니다.

recycled image1 :[email protected] 
recycled image2 :[email protected] 
recycled image3 :null 
recycled image4 :[email protected] 

당신은 여전히 ​​loadedImageDraggable에 싸여 주변이 비트 맵 객체가 발생한 것을, 마지막 줄에 볼 수 있습니다 내가 코드를 실행했을 때 내가 실제로 가지고하면이 로그 추적이다. 객체는 참조를 통해 메소드에 전달되므로 객체가 null로 설정되면 Java에서 해당 비트 맵 객체에 대한 모든 참조를 정리해야합니다. 혼란 스럽습니다 :/ 누군가 이걸 해결할 수 있습니까?

+0

'loadedImageDragable'의 클래스는 무엇입니까? 어쨌든 아마도 주 인스턴스가 아니라 복사본이 반환 될 것입니다. – SJuan76

+0

아니요 - 클래스에 비트 맵 복사 작업이 없습니다. 내부 Bitmap 속성에 대한 getter 및 setter가 있습니다. – stoefln

답변

1

추가 설명을하기 전에 재활용 방법에 대한 일반적인 개요를 알려 드리고자합니다. 이 비트 맵과 연관된 API 레벨 1 bitmap.recycle() 자유로운 기본 객체 및 상기 화소 데이터에 대한 참조를 취소 : 여기

공개 무효 재순환() 이후 정의된다. 이렇게하면 픽셀 데이터가 동 기적으로 해제되지 않습니다. 다른 참조가 없으면 단순히 가비지 수집을 허용합니다. 비트 맵은 "dead"으로 표시되어 getPixels() 또는 setPixels()이 호출되면 예외가 발생하고 아무 것도 그려지지 않습니다. 이 작업은 되돌릴 수 없으므로 비트 맵을 더 이상 사용하지 않을 경우에만이 작업을 호출해야합니다. 이것은 고급 호출이며 일반적으로 호출 할 필요가 없습니다. 일반적인 GC 프로세스는이 비트 맵에 대한 참조가 더 이상 없을 때이 메모리를 비 웁니다.

귀하의 경우에는 여전히 비트 맵 개체에 대한 참조를 보유하고 있지만 비트 맵 드로어 블 DEAD를 호출 할 수 있습니다.

loadedImageDraggable을 setBitmap (null)으로 무효화 할 때. 그것은 GC에 대한 자격이됩니다.

심지어 GC 작업은 여러 조건에 따라 달라지며 그 중 하나는 리소스 기아입니다. 그때까지는 수집된다는 것을 결코 알지 못합니다. 희망이 당신에게 더 나은 이해를 줄 것이다.

+0

감사합니다. 모든 참조가 제거되었는지 확인하는 방법이 있습니까? 내 말은 그 한 이미지를 사용하는 20 개의 객체가 있다고 말하면, 실제로 수동으로 추적하고 각 포인터를 null로 설정해야합니까? – stoefln

+0

예,'finalize() {// 여기에서 해제하십시오}'또는'try-fianlly {// 여기에서 해제하십시오}'를 사용하면 코드의 일관성이 향상됩니다. –

2

동일한 비트 맵 객체에 대한 참조가 두 개 있습니다. 하나는 bitmap 다른 하나는 loadedImageDraggable 으로 설정하면 bitmap을 null로 설정하면 loadedImageDraggable 내부의 참조는 물론 변경되지 않습니다. 그것은 여전히 ​​귀하의 비트 맵을 가리 킵니다 @ 41afa8e0

+0

감사합니다. 모든 참조가 제거되었는지 확인하는 방법이 있습니까? 내 말은 내가 그 이미지를 사용하는 20 개의 객체를 가지고 있다고 말하면, 나는 실제로 그것들을 수동으로 추적하고 각 포인터를 null로 설정해야만 하는가? – stoefln

관련 문제