gpt4 book ai didi

android - 泄漏在 xaml 中加载的自定义 View

转载 作者:行者123 更新时间:2023-11-29 19:33:04 25 4
gpt4 key购买 nike

我的一个 Activity 从未被处置,因为它的一个 subview 注册到事件处理程序并且从不注销它,我试图在 subview Dispose 方法中注销它但它从未被调用。

subview 使用事件处理程序 CrossConnectivity 在网络连接断开时显示自身,并在连接再次接通时隐藏自身。

此 subview 在布局 axml 中引用,因此在布局展开时对其进行实例化。

只加载布局的 Activity

using Android.App;
using Android.OS;

namespace MyNamespace
{
[Activity(Label = "SimpleActivity")]
public class SimpleActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.SimpleLayout);
}
}
}

上述布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<MyNamespace.NetworkStateView
android:text="No network"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textViewNetworkState" />
</LinearLayout>

自定义 View

using System;
using Android.Content;
using Android.Util;
using Android.Views;
using Android.Widget;
using Connectivity.Plugin;
using Connectivity.Plugin.Abstractions;

namespace MyNamespace
{
public class NetworkStateView : TextView
{
public NetworkStateView(Context ctx) : base(ctx)
{
}

public NetworkStateView(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer)
{
}

public NetworkStateView(Context context, IAttributeSet attrs) : base(context, attrs)
{
}

protected override void OnFinishInflate()
{
base.OnFinishInflate();
BindConnectivity();
}

void BindConnectivity()
{
CrossConnectivity.Current.ConnectivityChanged += OnConnectivityChanged;
UpdateVisibility();
}

void OnConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
{
UpdateVisibility();
}

void UpdateVisibility()
{
Visibility = CrossConnectivity.Current.IsConnected ? ViewStates.Gone : ViewStates.Visible;
}

protected override void Dispose(bool disposing)
{
CrossConnectivity.Current.ConnectivityChanged -= OnConnectivityChanged;
base.Dispose(disposing);
}
}
}

最佳答案

终于在写题的时候找到了解决方法,我重写了OnDetachedFromWindow,去掉了里面的事件处理程序

protected override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
CrossConnectivity.Current.ConnectivityChanged -= OnConnectivityChanged;
}

关于android - 泄漏在 xaml 中加载的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39620723/

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