2017-12-07 11 views
-1

public ContactsPanel(Activity activity,GoogleMap mGoogleMap)UI 객체를 생성자 매개 변수로 전달

이 생성자에는 클래스가 있습니다. 이 클래스는 기본적으로 mGoogleMaps에서 마커를 클릭하면 마커 세부 정보로 '활동'에 UI을 부풀립니다. 지역 사회에 대한 나의 질문은 다음과 같습니다

  1. 그때 나는 개체의 활동과 mGoogleMap에 대한 메모리 할당을 복제하는 OS를 강요하고 ContactsPanel의 첫 번째 인스턴스를 생성하고 있다면?

  2. ContactsPanel의 인스턴스가 10 개라면 어떻게 될까요? 메모리에있는 10 개의 Google지도와 메모리에있는 10 개의 활동을 의미할까요? 아니면 모든 객체가 원래 만들어진 동일한 객체를 참조 할 것입니까?

고마워요!

답변

2

아니요, 매개 변수로 전달하는 activity 또는 googleMaps 또는 Ojects의 인스턴스를 복제하지 않습니다.

는 인스턴스를 생성하면, 그것은 당신이 다음 ContactsPanel의 새로운 인스턴스가 힙에 위치 Y에서 생성됩니다 ContactPanel(activity,mGoogleMap)를 호출 할 때, 메모리 위치 X에 힙에 저장되고 변수 activityContactPanel 내부 mGoogleMaps 여전히 X를 가리키는 힙에.

편집

문제가 메모리 누수로 제공하지만 당신이 무거운 object의 단일 인스턴스에 대한 N 수정이있는 경우, 당신이 10로 activity 인스턴스를 공유 고려는 OK의 단점에 대한 귀하의 질문에 대답하려면 개체, 지금도 비록 당신의 activity,하지만 그 중 하나를 참조를 보유하고 귀하의 10 개체 중 하나가 여전히 메모리에 살고, gc 활동의 메모리를 수집하자 실 거예요.

+0

그리고 10 인스턴스에서 작동하도록 생각 . 원래 그것을 호스팅하는 루트 Activity/Fragment에서 하나의 "Static"참조 만 노출되는 것과 달리 GoogleMap 또는 Activity와 같은 복잡한 객체에 대해 여러 "Handler"를 갖는 것과 관련하여 볼 수있는 단점이 있습니까? –

+0

내 대답을 편집하여 질문에 답하십시오 –

+0

MapFragment는 원래 mGoogleMap을 호스팅하는 루트 조각입니다. ContactPanel도이 부분에서 인스턴스화됩니다. ContactsPanel에 대한 내 생성자에서 정적 인 int objCount를 사용하여 생성자를 증가시키고 기록합니다. ContactsPanel을 사용하여지도에서 다른 POI의 세부 정보가 포함 된 UI를 부 풀리면 여러 POI에 대해 ContactPanel Object를 사용하여 여러 UI를 전개 한 후 objCount가 1로 유지됩니다. 그러나 MapFragment에서 다른 조각으로 전환 한 다음 MapFragment로 돌아갈 때마다 ContactPanel의 objCount가 증가 할 때마다 –

0

당신은 생성자에서 액티비티와 맵을 전달할 수 있습니다. 단지 참조를 전달할 것이므로 객체를 복제하지 않을 것입니다.

그래서 같은 개체에 대한 모든 개체 참조를 말할 수 있습니다.

0

나는 원래 mGoogleMap를 조작하기 위해 기본적으로 10 개의 서로 다른 "처리기"또는 "참조"를 의미 할 것입니다 당신이 Activity 또는 Object의 인스턴스를 얻을 수 WeakReference<>을 사용할 수 있으며 ContactPanel의

class ExampleWeakReference { 
    private WeakReference<DashboardActivity> mActivityWeakReference; 

    ExampleWeakReference(DashboardActivity activity) { 
     mActivityWeakReference = new WeakReference<DashboardActivity>(activity); 
    } 

    private void doSomethingWithId() { 
     DashboardActivity dashboardActivity = mActivityWeakReference.get(); 
     dashboardActivity.mToolbar.setBackgroundColor(Color.RED); 
    } 
}