Xamarin.android 如何在销毁活动时清除片段使用的资源?
例如,我在片段中添加了TextView,如下所示Xamarin.android 如何在销毁活动时清除片段使用的资源?,xamarin.android,Xamarin.android,例如,我在片段中添加了TextView,如下所示 var adaptor = new GenericFragmentPagerAdaptor(SupportFragmentManager); // where GenericFragementPagerAdaptor is a sub-class derived from FragementPagerAdaptor adaptor.AddFragmentView((i, v, b) => {
var adaptor = new GenericFragmentPagerAdaptor(SupportFragmentManager); // where GenericFragementPagerAdaptor is a sub-class derived from FragementPagerAdaptor
adaptor.AddFragmentView((i, v, b) => {
var view = i.Inflate(Resource.Layout.tab, v, false);
textView = new TextView(view.Context);
textView.Text = "Test1";
view.FindViewById<FrameLayout>(Resource.Id.mainFrame).AddView(textView);
return view;
var适配器=新的GenericFragmentPagerAdaptor(SupportFragmentManager);//其中,GenericFragementPagerAdaptor是从FragementPagerAdaptor派生的子类
Adapter.AddFragmentView((i,v,b)=>{
var视图=i.Inflate(Resource.Layout.tab,v,false);
textView=新的textView(view.Context);
textView.Text=“Test1”;
view.findviewbyd(Resource.Id.mainFrame).AddView(textView);
返回视图;
如果我正在销毁当前活动意味着,所有与片段相关的资源都应该被清除。我在哪里以及如何才能做到这一点?请任何人建议我。谢谢
在销毁活动(onDestroy())之前,将调用片段的生命周期方法onDestroyView()和onDetach()
onDestroyView()->告诉片段其视图正在被销毁,以便它可以清理任何相关资源
我的建议是下载一次这个示例,并探索fragment的所有生命周期方法
如果需要任何进一步的帮助,我将不胜感激
在带有UI的片段中,您通常将一些视图保存为实例状态以加快访问速度。例如,指向EditText的链接,这样您就不必一直查找它
问题是视图保留了对活动上下文的引用。现在,如果保留了视图,也保留了对该上下文的引用
如果上下文仍然有效,但典型的保留情况是重新启动活动,则这没有问题。例如,对于屏幕旋转,通常情况下。活动重新创建将创建一个新上下文,旧上下文将被垃圾收集。但现在不能垃圾收集,因为片段仍然引用旧上下文
下面的示例演示如何不执行此操作
公共类LeakyFragment扩展了片段{
private View mLeak; // retained
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mLeak = inflater.inflate(R.layout.whatever, container, false);
return mLeak;
}
@Override
public void onDestroyView() {
super.onDestroyView();
// not cleaning up.
}
}
要解决该问题,您需要清除对onDestroyView中UI的所有引用。一旦片段实例被重新使用,您将被要求在onCreateView上创建新UI。在onDestroyView之后保留UI也没有意义。UI将不会被使用
本例中的修复只是更改onDestroyView()方法
除了保留对视图的引用外,您显然不应该保留对活动(例如,onAttach上的onAttach-clean)或任何上下文(除非是应用程序上下文)的引用。谢谢
在销毁活动(onDestroy())之前,将调用片段的生命周期方法onDestroyView()和onDetach()
onDestroyView()->告诉片段其视图正在被销毁,以便它可以清理任何相关资源
我的建议是下载一次这个示例,并探索fragment的所有生命周期方法
如果需要任何进一步的帮助,我将不胜感激
在带有UI的片段中,您通常将一些视图保存为实例状态以加快访问速度。例如,指向EditText的链接,这样您就不必一直查找它
问题是视图保留了对活动上下文的引用。现在,如果保留了视图,也保留了对该上下文的引用
如果上下文仍然有效,但典型的保留情况是重新启动活动,则这没有问题。例如,对于屏幕旋转,通常情况下。活动重新创建将创建一个新上下文,旧上下文将被垃圾收集。但现在不能垃圾收集,因为片段仍然引用旧上下文
下面的示例演示如何不执行此操作
公共类LeakyFragment扩展了片段{
private View mLeak; // retained
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mLeak = inflater.inflate(R.layout.whatever, container, false);
return mLeak;
}
@Override
public void onDestroyView() {
super.onDestroyView();
// not cleaning up.
}
}
要解决该问题,您需要清除对onDestroyView中UI的所有引用。一旦片段实例被重新使用,您将被要求在onCreateView上创建新UI。在onDestroyView之后保留UI也没有意义。UI将不会被使用
本例中的修复只是更改onDestroyView()方法
除了保留对视图的引用,您显然不应该保留对活动的引用(例如,onAttach上的onAttach-clean)或任何上下文(除非是应用程序上下文)。这与其他在C#中不再需要时需要释放的资源有什么不同(我假设它是C#)?解决这些用例的方法是:创建一个实现IDisposable的类,并在
块中使用它,并可能提供一个合适的析构函数。我的意思是,片段中使用的视图就是这里的资源。我尝试过实现IDisposable,但它不起作用,“不起作用”除了Sachin的建议(当类的生命周期状态发生变化时使用类提供的回调/事件)之外,您还可以实现一个Dispose()
方法,该方法“清除与片段相关的资源”,不管这些是什么(此处的视图)当然,Dispose()
函数必须在使用
块的结尾处显式或隐式调用。到底什么不起作用?我能够理解您的解决方案,如果我调用dispose,所使用的资源将被清除。但我的疑问是,我如何才能获得片段中使用的资源或视图?一旦我获得它,我将在dis中清除pose方法或其他销毁方法。一些“资源”可能可以通过正在处理的对象的成员访问(我猜textView
是一个成员变量?)。如果必须处理视图
,它是I.Inflate()的结果
但该结果不会存储在任何地方,也无法在任何地方访问,您的工作就是记住它,例如在您的另一个成员中