首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在presenter中使用在Application类中声明静态变量是个好主意吗

在presenter中使用在Application类中声明静态变量并不是一个好主意。虽然在某些情况下可能会解决一些问题,但这种做法存在一些潜在的问题和风险。

  1. 违反了单一职责原则:presenter应该专注于处理视图逻辑和业务逻辑,而不应该直接依赖于Application类中的静态变量。这样做会导致presenter的职责不清晰,增加了代码的复杂性和维护成本。
  2. 可能引发内存泄漏:如果presenter持有Application类中的静态变量的引用,并且没有正确释放,就可能导致内存泄漏问题。这是因为静态变量的生命周期与应用程序的生命周期相同,如果presenter没有正确释放对静态变量的引用,那么这些对象将一直存在于内存中,无法被垃圾回收。
  3. 可能引发并发访问问题:如果多个presenter同时访问Application类中的静态变量,并且对其进行修改,就可能引发并发访问问题。这会导致数据不一致性和竞态条件的发生。

相反,更好的做法是使用依赖注入(Dependency Injection)来提供所需的依赖项。通过将依赖项作为参数传递给presenter的构造函数或使用依赖注入容器,可以更好地管理和控制presenter所需的对象。这样可以提高代码的可测试性、可维护性和可扩展性。

总结:在presenter中使用在Application类中声明静态变量不是一个好主意,应该使用依赖注入来管理presenter所需的依赖项。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Dagger2 Android依赖注入学习笔记

就会变得臃肿,如果 AAA 的初始化参数变了,不仅 AAA 需要改,MainActivity 因为它与AAA的耦合也要跟着改变,如果 AAA 不止用在 MainActivity 用在了其他的...@Provides Provides与Module一起使用的,@Provides用于标注Module所标注的的方法,该方法会在需要提供依赖时被调用,方法内进行对象的初始化,返回对象依赖给标注了...构造函数含参的对象注入 相信很多的时候,我们要用的对象构造的时候需要参数的,那我们如何进行它们的依赖注入呢,这里我用 MVP Presenter 来进行演示。...MainActivityModule ,并在该类名加上@Module注解,它含有一成员变量 mView 需要在构造函数时赋值,我们之后会将这个变量Presenter 进行 Presenter 的构造...所以说,是否项目中使用 Dagger2 仁者见仁智者见智,不过作为一学习的点,还是挺不错的,嗯。 以上就是本文的全部内容,希望对大家的学习有所帮助。

66130

如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

MVP一种开发模式或者架构,RxJava与Retrofit库,前面的异步的库,后面的提供Restful请求的库,这两库都是为了MVP开发模式服务的。...构造的实例的时候,就知道从哪里去找到需要的依赖 Provide--modules,我们定义的方法用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...scope的例子,我们用自定义的@PerActivity注解一,所以这个对象存活时间就和 activity的一样。...dagger2; 创建提供应用实例的AppComponent 一用在创建时会产生唯一的Application对象,可以应用的onCreate函数创建,下面有几个步骤: 1.创建提供应用对象的Component...总结 创建module,一般应用于第三方包对象或者应用对象 创建Component,依赖注入器,复杂把注入对象注入到注解成员变量 构造方法注入:的构造方法前面注释@Inject 成员变量注入:

1.5K80

Dagger2系列——实例解析

当然一Component可以依赖多个Module,如代码块1:还依赖了AppModule,AppModule中提供了Component方法名getContext()的实例对象,如下代码: @Module...AppComponent中提供的IRetrofitRequest单例对象如何在Application中使用呢?...AppComponent后期拓展: 一全局的变量现在统一都可以放在AppComponent中进行管理,这个demo中有网络请求的一单例接口对象,一全局的Context对象。...MainActivity如何进行使用: 这里用的mvp开发模式,所以需要一Presenter:MainActivityPresenter,需要传递一参数,用于操作MainActivity界面:....inject(this); 原因: 1.因为App我并没有哪个对象的声明用了@Inject注解进行标注,而且App的AppComponent实例对象需要给其他Activity或者使用。

61631

Android组件化搭建

什么基础模块,基础模块就是公司常用的一些sdk,一些封装好的基,业务模块就是基于基础模块进行开发的。...gradle.properties,我们可以设置一变量,控制是否使用模块化来开发: #是否使用模块化开发 isModule=false 然后settings.gradle设置项目引入包 ?...现在的问题,不同模块的activity怎么跳转,以前我的做法都会在每个activity写一静态方法,把入参设定好. ?...契约,来制定接口,Presenter跟view接口的同时,我们可以很清晰的知道,表现层需要什么东西,view层需要提供什么东西,包括网络请求后相应的响应,这样我们做一业务逻辑的时候思路可以更清晰...RxObservable,创建一sObservableDisposableList用于保存每个presenter处理的事件,通过tag作为标识创建,每个presenter中会通过tag找到对应的

95770

ViewModel 和 LiveData:为设计模式打 Call 还是唱反调?

❌ 不要让 ViewModel(或Presenter)直接使用 Android 框架内的 条件语句、循环和一般的判定等语句应该在 ViewModel 或者应用程序的其他层完成,而不是 Activity...应用中放一数据层好主意,数据层完全不关心展示层(MVP 的 P)。...示例,我们继承 LiveData 创建一叫做 SingleLiveEvent 的来解决这个问题。它仅仅发送发生在订阅后的更新,要注意的这个只支持一观察者。...如果数据仓库单例或者Application 的生命周期绑定的,这个数据仓库进程被杀掉之前都不会被销毁。...继承 LiveData LiveData 最常见的用例 ViewModel 中使用 MutableLiveData 并且将它们暴露为 LiveData 来保证观察者不会改变他们。

3K30

看到如此多的MVP+Dagger2+Retrofit+Rxjava项目,轻松拿star,心动了吗?

+ Retrofit + Rxjava 项目 MVPArt 新的 MVP 架构,适合中小型项目,旨在解决传统 MVP 和接口太多,并且 Presenter 和 View 通过接口通信过于繁琐,...PresenterMVP的大部分的作用为通过从Model层接口获取数据,调用View层接口显示数据,首先实现BasePresenter,指定Model和View的范型,注意一定要指定Contract...包下的autolayout包,xml引用即可使子控件自适应,并且还提供一 Template(最后面)用于生成自适应所需要的的Auto系列View,如需要使ScrollView的子控件自适应,...debug { //这两变量自定义的,自己也可以自定义字段,他会默认配置到BuildConfig,app可以根据这些字段执行一些操作 buildConfigField...的时候,就只有自定义 Application 并继承于三方库的 Application,这时就不用再继承 BaseApplication,只用在自定义 Application 对应的生命周期调用 AppDelegate

2.9K30

使用ASP.NET实现Model View Presenter(MVP)

l 后置代码模型的另一缺点它难以不借助帮助/工具实现重用后置代码页面之间的可重用代码。很明显的,这也是提供了一适当的解决方案,但往往导致ASP式的,不像是一流的对象。...我们已经从创建ASPX页面到一Presenter,一View接口和一单元测试……,我们获得的好处Presenter的单元测试,也就是很容易的对后置代码页面进行单元测试。...但是比较有代表性的应用,一页面通常包含一或者多个功能性的区段,他们可能WebPart,用户控件等等。企业级应用,保持功能性的分离以及很容易的从一地方移动到另一地方是非常重要的。...例如数据绑定,IsPostBack的时候不能被引发。 声明:Page.IsPostBack和Page.IsValidWeb特有的。下面所讨论的Presenter层只Web环境中有效。...A)创建用户控件 这一步只是表示ASPX页面声明的用户控件。页面初始化的时候,用户控件被创建。图中表示的实现接口IcurrentTimeView的用户控件。

1.1K80

Android 构建快速可靠的 UI 测试

我第一次安卓应用中使用UI自动化测试几年前使用Robotium(译者注:Robotiumandroid的一自动化测试框架)。我认为测试环境越逼真越好。...最终测试应当表现得如同超人一般能够迅速的点击任意一位置而且并不会报错,对吧?我认为mocking测试很糟糕。为什么我们需要在测试的时候改变应用的行为?那不是欺骗?...MVP架构 DataManagerModel层唯一暴露给Presenter层的数据的,因此为了测试Model层我们只需要替换为一模拟 的DataManger即可。...应用的ApplicationComponent Application初始化: ?...这也是确保TestComponent在任何Activity运行之前Application设定好。

92310

界面之下:还原真实的MV*模式

(关键) 对比MVC,Controller不能操作View的,View也没有提供相应的接口;而在MVP当中,Presenter可以操作View,View需要提供一组对界面操作的接口给Presenter...历史背景 MVVM模式最早微软公司提出,并且了大量使用在.NET的WPF和Sliverlight。...但是,ViewModel当中会有一叫Binder,或者Data-binding engine的东西。以前全部由Presenter负责的View和Model之间数据同步操作交由给Binder处理。...所以例子中使用了一MVVM的库:Vue.js - http://vuejs.org/。 MVVM的优缺点 优点: 提高可维护性。...数据绑定的声明指令式地写在View的模版当中的,这些内容没办法去打断点debug的。 结语 可以看到,从MVC->MVP->MVVM,就像一打怪升级的过程。

60520

48条高效率的PHP优化写法

特别不要在循环中使用@。 5 次循环的测试,即使先用error_reporting(0)关掉错误,循环完成后再打开,都比用@快。...3.5 用子类方法 基里面只放能重用的方法,其他功能尽量放在子类实现,子类里方法的性能优于。 3.6 的性能和其方法数量没有关系 新添加10或多个方法到测试的后,性能没什么差异。...4.3 方法里建立局部变量 的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快。 4.4 局部变量比全局变量快 由于局部变量存在栈的。...4.6 提前声明局部变量 建立一声明的局部变量,要比建立一已经定义过的局部变量慢9-10倍。 4.7 谨慎声明全局变量 声明未被任何一函数使用过的全局变量,也会使性能降低。...4.11 一定要对变量进行初始化 这里的“初始化”指的是“声明”。 当需要没有初始化的变量,PHP解释器会自动创建一变量,但依靠这个特性来编程并不是一好主意

2.5K110

48 条高效率的 PHP 优化写法

特别不要在循环中使用@。 5 次循环的测试,即使先用error_reporting(0)关掉错误,循环完成后再打开,都比用@快。...3.5 用子类方法 基里面只放能重用的方法,其他功能尽量放在子类实现,子类里方法的性能优于。 3.6 的性能和其方法数量没有关系 新添加10或多个方法到测试的后,性能没什么差异。...4.3 方法里建立局部变量 的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快。 4.4 局部变量比全局变量快 由于局部变量存在栈的。...4.6 提前声明局部变量 建立一声明的局部变量,要比建立一已经定义过的局部变量慢9-10倍。 4.7 谨慎声明全局变量 声明未被任何一函数使用过的全局变量,也会使性能降低。...4.11 一定要对变量进行初始化 这里的“初始化”指的是“声明”。 当需要没有初始化的变量,PHP解释器会自动创建一变量,但依靠这个特性来编程并不是一好主意

82930

48 条高效率的 PHP 优化写法

特别不要在循环中使用@。 5 次循环的测试,即使先用error_reporting(0)关掉错误,循环完成后再打开,都比用@快。...3.5 用子类方法 基里面只放能重用的方法,其他功能尽量放在子类实现,子类里方法的性能优于。 3.6 的性能和其方法数量没有关系 新添加10或多个方法到测试的后,性能没什么差异。...4.3 方法里建立局部变量 的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快。 4.4 局部变量比全局变量快 由于局部变量存在栈的。...4.6 提前声明局部变量 建立一声明的局部变量,要比建立一已经定义过的局部变量慢9-10倍。 4.7 谨慎声明全局变量 声明未被任何一函数使用过的全局变量,也会使性能降低。...4.11 一定要对变量进行初始化 这里的“初始化”指的是“声明”。 当需要没有初始化的变量,PHP解释器会自动创建一变量,但依靠这个特性来编程并不是一好主意

97740

Dagger2从懵懂到精通,在线学习那点事儿

举个例子:我们写面向对象程序时,往往会用到组合,即在一引用另一,从而可以调用引用的的方法完成某些功能,就像下面这样. public class ClassA { ......mvp,最常见的一种依赖关系,就是Activity持有presenter的引用,并在Activity实例化这个presenter,即Activity依赖presenterpresenter又需要依赖...我们先看MainActivity里的代码,之前直接声明MainPresenter,现在在声明的基础上加了一注解@Inject,表明MainPresenter需要注入到MainActivity,即...此时我们已经完成了presenter的注入过程,但是我们发现还有一MainModule,这个做什么的?MainModlue注解,用@Module注解标注,主要用来提供依赖。...我们MainModule声明了MainContract.View成员属性,构造方法里将外界传进来的view赋值给mView,并通过一@Provides标注的以provide开头的方法,将这个view

64000

手把手教你封装一健壮的MVP框架,面向接口开发。

目前这个框架已经应用在我写的公司项目上。趁最近有时间,对框架存在的问题和缺陷,经历过这次实战,也进行了修复,同时加入了一些JetPack的组件。...,检查是否声明了@CreatePresenter(xx.class)注解"); } } } 具体使用过程如下: //Presenter @CreateModel(TestModels.class...下面我简单谈一下我对移动端框架的想法和一些封装过程的理解及项目实战的坑。 MVP架构,网上有些图中M和P不是没有互相关联,为什么你要选择互相关联?...以前的封装,我并没有让M与P互相关联,但是实际开发,我逐渐发现很多地方其实需要用到P,如果不关联,将导致很多逻辑操作必须放在P层,从而弱化了M层真正作用。...其实 MVP,很多人认为P层最重要的,其实不然,P只是一中间商,它的作用就是协调M和V,从而让M,V解耦。

38930

带你解析Dagger2

modules的一重要特征它们设计为分区并组合在一起(比如说,我们的app可以有多个组成在一起的modules)。...scope的例子,我们用自定义的@PerActivity注解一,所以这个对象存活时间就和 activity的一样。...Application Component: 生命周期跟Application一样的组件。可注入到AndroidApplication和BaseActivity。...@Inject 成员变量注入:的成员变量(非私有)前面注释@Inject 函数方法注入:函数前面注释@Inject 这个顺序Dagger建议使用的,因为在运行的过程,总会有一些奇怪的问题甚至空指针...这在Android的activity或者fragment中使用成员变量注入会经常遇到,因为我们没有它们的构造方法中使用。 看一下我们如何在BaseActivity中注入一成员变量

71240

详解Android单元测试最佳实践

简介 Android原生应用开发,存在两种单元测试:本地JVM测试和Instrumentation测试。...这种方式运行速度慢,且严重依赖Android运行环境,更适合用来做集成测试 准备 我准备了一简单的APP,模拟一耗时的网络请求获得一段数据并显示界面上,针对这个APP编写单元测试用例并进行本地单元测试...Robolectric开源的单元测试框架,能够完全模拟Android SDK并在JVM运行。...UI依赖于Persenter,Activity通过静态工厂方法创建依赖的Presenter实例,需要使用PowerMock来模拟创建Presenter过程,完成Presenter模拟对象的注入 配置...SlowServiceImpl(); String data = impl.fetch(); assertEquals("from slow service", data); } } 自动化测试 自动化测试一般持续集成环境中使用命令来执行单元测试

2.5K31

再探Kotlin 跨平台——迁移Paging分页库至KMM

上周,Square正式将Paging分页库迁移到了Kotlin Multiplatform平台,使用在旗下的支付软件Cash App。...如果你之前从未使用过Paging库,可以参考许久之前我写的两篇相关文章: View中使用Paging3分页库 Compose中使用分页库 接下来我们就以multiplatform-paging-samples...接着我们来看这个项目结构怎么样的。 项目架构 从项目架构可以看出在共享模块,只有iosMain并没有AndroidMain,这是因为我们前面所讲到的针对Android平台可以无缝迁移的。...仅定义了两未使用的方法,用于将类型导出到Object-C或Swift,代码如下所示。...}       }     }   } } iOS平台的实现 AppDelegate.swift文件程序启动入口文件,RepositoryCell继承自UICollectionViewCell,并补充了

1.1K20

项目中怎么灵活使用Dagger?

看到身边的朋友都已早早在项目中使用这些技术, 而你还不会, 失落?...Model,MVP最大的好处之一就是可以重用M和P层 有些没有Model层,直接给Presenter注入Retrofit Api(有些注入一管理,如果项目小接口少,这样还不错,但是有没有想过项目一大...,接口一多里面就非常混乱),所有网络请求逻辑Presenter,如果现在需求变了,需要加入缓存,就需要更改Presenter的逻辑,这样就可能影响一些和这个功能无关的逻辑,如果有Model层,里面持有请求网络和缓存的功能...项目中用到最多的就是向Presenter提供View和Model的同时,向每一层提供所需要的单例,并且使用Dagger不断的重用Presenter和Model,其实Dagger本来就抽象,说再多不如直接看代码怎么实现的...,然后照着模版直接在自己项目中使用,本文的主题不就是项目中怎么灵活使用Dagger?

85120

字节前端二面高频vue面试题整理_2023-02-24

prop 值,可以 data 里面定义一变量 并用 prop 的值初始化它 之后用$emit 通知父组件去修改 有两种常见的试图改变一 prop 的情形 : 这个 prop 用来传递一初始值;...过滤器的作用,如何实现一过滤器 根据过滤器的名称,过滤器用来过滤数据的,Vue中使用filters来过滤数据,filters不会修改数据,而是过滤数据,改变用户看到的输出(计算属性 computed...Vue data 某一属性的值发生改变后,视图会立即同步执行重新渲染? 不会立即同步执行重新渲染。...MVC 的Controller 只知道 Model 的接口,因此它没有办法控制 View 层的更新,MVP 模式,View 层的接口暴露给了 Presenter 因此可以 Presenter 中将...但是Vue,由于模板中使用的数据都必须挂在 this 上进行一次中转,所以 import 一组件完了之后,还需要在 components 声明下。

1.3K50
领券