将UI对象作为构造函数参数传递

时间:2017-12-07 07:35:54

标签: android memory

public ContactsPanel(Activity activity,GoogleMap mGoogleMap)

我有一个带有此构造函数的类。这个课程基本上会夸大UI"活动"在mGoogleMaps上单击标记时使用标记详细信息。我对社区的问题是:

  1. 如果我正在创建ContactsPanel的第一个实例,那么我是否强制操作系统重复对象活动和mGoogleMap的内存分配?

  2. 如果我有10个ContactsPanel个实例怎么办?这是指内存中的10个Google地图和内存中的10个活动吗?或者所有对象都将引用最初创建的同一个对象?

  3. 谢谢!

3 个答案:

答案 0 :(得分:2)

不,您不会复制作为参数传递的activitygoogleMaps或任何其他Ojects的实例。

创建实例后,它将存储在内存位置X的堆中,当您调用ContactPanel(activity,mGoogleMap)时,会在堆中的位置Y创建ContactsPanel的新实例,并且变量{{1 } activity内的mGoogleMaps仍然指向堆中的X.

修改

要回答关于缺点的问题,如果您对单个重型ContactPanel实例有N个修饰符,那么确定但问题是内存泄漏, 考虑你与10个对象共享你的object实例,现在即使你完成了activity,但是你的10个对象中有一个仍然存在于内存中,它不会让{{1}收集活动的记忆。

答案 1 :(得分:0)

你可以在你的构造函数中传递活动和映射,它只会传递引用,它不会复制任何对象。

所以你可以说所有对象引用同一个对象。

答案 2 :(得分:0)

我认为您可以使用WeakReference<>获取ActivityObject的实例并使用

 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);
    }
}