问题描述
我继承了Xamarin.Android应用程序,该应用程序存在内存性能问题。内存分析显示,内存中保留了许多对象(实时计数为1或更大)。我想知道 DI的配置是否对此有所贡献?
- 该应用程序构建有 1个活动,可在几个片段(页面)之间导航。
- MVP体系结构与.NET Standard 2.0库中的视图和演示者一起使用。
- 用于DI的Autofac
在用户向前/向后导航时切换片段,即:
Fragment1 (Page1) --NAV--> Fragment2 (Page2) --BACK--> Fragment1 (Page1)
当用户返回到Fragment1,Fragment2时,它是Presenter,并且子级在应用程序的生命周期中保留在内存中。
任何了解正在发生的事情的技巧/帮助将不胜感激!
我的想法/关注领域:
-
缺少“使用(var scope = App.Container.BeginLifetimeScope()){...}”。
这是否意味着SingleInstance对象的作用域是根级别?
因此,这是否可以防止在不再需要为演示者对象(注入这些对象)(以及随后的片段)分配的内存时就对其进行垃圾回收?
鉴于以下架构,应在哪里适当地使用BeginLifetimeScope?
-
Application.Context在类(StringResources)中作为私有字段存储/引用,然后注入到Presenter构造函数中。
[------------代码片段--------------]
AndroidApp.Application.cs
-
在此设置了Autofac容器。
-
builder.RegisterType<NavigationService>().As<INavigationService>().SingleInstance(); builder.RegisterType<sqliteConnection>().As<IsqliteConnection>().SingleInstance(); builder.RegisterType<LocationService>().As<ILocationService>().SingleInstance(); //*note context is stored in StringResources: private readonly Context _context;* builder.Register<IStringResources>(c => new StringResources(Application.Context)); builder.RegisterType<SamplePresenter>(); builder.RegisterType<SampleRepository>().As<ISampleRepository>();
-
某些依赖项已在此处解决。在应用程序中任何地方否使用using(变量范围= App.Container.BeginLifetimeScope())。
IOCContainer.Instance.Resolve<IAppConfigProvider>().Load();
AndroidApp.SampleFragment.cs
- 片段的构造如下:
public class SampleFragment : BaseFragment<SamplePresenter,ISampleView>,ISampleView
{
.
.
.
}
Core.SamplePresenter.cs
public SamplePresenter(INavigationService navigator,//.SingleInstance
IStringResources stringResources,//private ref to App.Context
IJsonSerializer jsonSerializer,ILocationService locationService,//.SingleInstance
IDateUtility dateUtility,IService1 service1,IDataManager dataManager) : base(navigator)
{
_stringResources = stringResources;
_jsonSerializer = jsonSerializer;
_locationService = locationService;
_dateUtility = dateUtility;
_service1 = service1;
_dataManager = dataManager;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)