2016-09-21 1 views
1

Один из моих действий никогда не удаляется, поскольку одно из его подчиненных регистров регистрируется обработчиком событий и никогда не отменяет его регистрацию. Я попытался отменить его в методе Dispose, но его никогда не вызывал.Утечка на пользовательском представлении, загруженном в xaml

Подраздел использует обработчик событий CrossConnectivity, чтобы показать себя, когда сетевое соединение выключено и спрячется, когда соединение снова вставлено.

Это подвыборка ссылается на макет axml, поэтому его экземпляр создается, когда макет раздувается.

Деятельность, которая только загружает раскладку

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> 

Обычай вид

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

ответ

1

я, наконец, нашел способ решить эту проблему при написании вопроса , Я переопределяю OnDetachedFromWindow и удаляю в нем обработчик событий

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