【问题标题】:Passing UI objects as Constructor Parameters将 UI 对象作为构造函数参数传递
【发布时间】:2017-12-07 07:35:53
【问题描述】:

public ContactsPanel(Activity activity,GoogleMap mGoogleMap)

我有一个带有这个构造函数的类。当单击mGoogleMaps 上的标记时,此类基本上使用标记详细信息在“活动”上膨胀UI。我对社区的问题是:

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

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

谢谢!

【问题讨论】:

    标签: android memory


    【解决方案1】:

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

    创建实例后,它将存储在内存位置 X 的堆中,当您调用 ContactPanel(activity,mGoogleMap) 时,会在堆中的位置 Y 处创建 ContactsPanel 的新实例,变量 activitymGoogleMaps ContactPanel 内部仍然指向堆中的 X。

    编辑

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

    【讨论】:

    • ContactPanel 的 10 个实例基本上意味着 10 个不同的“处理程序”或“引用”来操作原始 mGoogleMap。与从最初托管它的根 Activity/Fragment 仅公开一个“静态”引用相比,为复杂对象(如 GoogleMap 或 Activity)拥有多个“处理程序”,您是否可能看到任何缺点?
    • MapFragment 是最初托管 mGoogleMap 的根 Fragment。 ContactPanel 也是从这个片段中实例化的。在我的 ContactsPanel 构造函数中,我有一个静态 int objCount,我递增并登录构造函数。我使用 ContactsPanel 在地图上使用不同 POI 的详细信息来膨胀 UI,并且在使用不同 POI 的 ContactPanel 对象进行多个 UI 膨胀后,objCount 保持为 1。但是,当我从 MapFragment 切换到另一个片段,然后再切换回 MapFragment 时,每次 ContactPanel 的 objCount 都会递增。
    • 那么在从 MapFragment 到 MapFragment 的 10 次移动之后,我的 objCount 是 10,这是否意味着我有 10 个 ContactPanel 实例?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我认为您可以使用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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-12
        • 1970-01-01
        • 2013-11-29
        • 2012-11-14
        • 1970-01-01
        • 2012-07-09
        • 2015-08-02
        • 2016-07-19
        • 2016-07-06
        相关资源
        最近更新 更多