gpt4 book ai didi

xml - 为什么当我将 MvxBindableSpinner 放入 MvxBindableListView 时,gref 会变得太高?

转载 作者:数据小太阳 更新时间:2023-10-29 02:20:49 35 4
gpt4 key购买 nike

我正在使用 mvvmcross 为 Android 开发应用程序。

在这个应用程序中,我想要一个包含微调器的列表。当我在模拟器上测试应用程序时,它看起来不错,但是当我滚动它时,它很快就会耗尽内存,因为 gref 超过 2000。我知道 gref 在真实设备上可以更高,但我仍然认为我一定做错了什么.

绑定(bind)列表

    <cirrious.mvvmcross.binding.android.views.MvxBindableListView
android:id="@+id/propertyHolder"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/obsBtLayout"
android:layout_above="@id/photoframe"
local:MvxBind="
{
'ItemsSource':{'Path':'PPHolders'},
'ItemClick':{'Path':'PropertyClickedCommand'}
}"
local:MvxItemTemplate="@layout/listitem_property"
/>

ListItem_Property.axml(已剥离)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/AIPApp.UI.Droid"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/ListItemSelector"
android:descendantFocusability="beforeDescendants"
>

<cirrious.mvvmcross.binding.android.views.MvxBindableSpinner
android:layout_gravity="center_horizontal"
android:layout_width="200dip"
android:layout_height="wrap_content"
local:MvxDropDownItemTemplate="@layout/spinneritem_propdropdown"
local:MvxItemTemplate="@layout/spinneritem_prop"
local:MvxBind="
{
'ItemsSource':{'Path':'CodeTableValues'},
'SelectedItem':{'Path':'ObservedCodeTable'},
'Visibility':{'Path':'IsCodeTableValue','Converter':'Visibility'}
}"/>

</LinearLayout>

这是因为每次滚动时都必须重建微调项吗?因为它绑定(bind)的列表在列表中的每个项目中都是不同的。因此,在一个 listitem 上,微调列表可以是 6 个项目,另一个可以是 3 个项目,依此类推。

最佳答案

我还没有对您所看到的行为进行全面分析 - 如果没有完整的代码示例,很难做到。

但是,特别感谢 Xamarin forums 上的 JonPryor我相信我现在至少对一般情况下 GREF 发生的事情有了更好的了解 - 所以我可以回答你的“为什么”问题。

绑定(bind)列表的一般情况是 GREF 递增:

  • 每组绑定(bind)一次 - 因为绑定(bind)存储在混合 C#/Java 容器对象中 - https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxJavaContainer.cs
  • 每个 ListView 项目一次 - 因为它用于列表
  • 对于 ListView 中具有绑定(bind)属性或事件的每个 View 对象一次 - 例如如果您绑定(bind)到 TextView和一个 Button在每个 ListView 项中,C# 将存储对这些 View 的引用

  • 在您的示例中,每个列表项本身将包含一个绑定(bind)列表 - 这将导致所需 GREF 数量成倍增加 - 这就是您看到报告的问题的原因。

    有了这种理解,显而易见的问题可能是“我们如何解决这个问题?”

    这不是一个容易回答的问题,但我认为有几种方法可以解决这个问题。

    首先,我们可以与 Xamarin 讨论这个问题——可能是应该增加可用 GREF 的数量——因为这些对象将在 Java 中的内存中,那么在 C# 中引用它们也许没有坏处?

    其次,我们可以考虑改变我们的 UI 绑定(bind)的实现方式,以便永久引用不会存储到所有对象——例如,如果我们一次性知道一个绑定(bind)(例如标签),那么我们可能会查看一个路由不为此功能使用 XML 数据绑定(bind)。例如,我们可以使用一个新的 View 来手动执行此绑定(bind)。

    第三,我们可以考虑更改绑定(bind)代码本身,以便对于单向绑定(bind)(从 ViewModel 到 View),它使用 FindViewById<TView> 检索 Android View 。在更新时而不是使用对 View 的保留引用。这会更慢,但会减少所需的 GREF 数量。在明确声明的“一次性”绑定(bind)的情况下,此功能可能最容易实现。

    四、 作为应用程序开发人员,这可能是您最容易获得的解决方案 ,您可以考虑更改 UI 实现,以便应用程序不使用这些绑定(bind)子列表 - 例如它可以改为使用标签 - 仅按需创建微调器(通过处理代码中的 Click 事件)。

    我相信除此之外还有其他选择......

    我在分析过程中问自己的一个问题是,这个问题是 MvvmCross 独有的,还是所有 MonoDroid 应用程序中都可能出现的问题。

    我不是 100% 肯定,但我认为答案是,这是一个会影响所有 MonoDroid 应用程序的普遍问题。不过,我也觉得 MvvmCross 给问题增加了一点:
  • 通过保留诸如 TextViews/labels 之类的引用
  • 通过让您更轻松地编写引用大量 Java 对象的代码。

  • 我也不认为这完全只是 MvvmCross 或 MonoDroid 问题。虽然由于 MonoDroid 的实现而突出了这个 GREF 限制,但这里的潜在问题实际上是一次尝试做太多事情 - 所以你真的可以通过简化设计/实现来提高应用程序的性能,以便它使用更少意见。虽然感觉可能不是这样,但我认为 MonoDroid 是 在这里帮我们一个忙 - 它指出我们的 UI 实现有点“胖”,我们应该考虑在我们的应用程序代码中对其进行优化。

    当我发现更多信息时,我会更新这个答案,但我希望上述信息已经让您对这种情况的“原因”有了很好的了解。

    关于xml - 为什么当我将 MvxBindableSpinner 放入 MvxBindableListView 时,gref 会变得太高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842864/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com