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

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

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

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

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

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

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

相关·内容

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或者类使用。

64131

Android组件化搭建

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

97470
  • 如何使用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.6K80

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

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

    2.9K30

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

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

    3.1K30

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

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

    1.1K80

    Android 中构建快速可靠的 UI 测试

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

    93410

    Swift 面试题

    fileprivate 和 private 的区别在于,fileprivate 是当前.swift文件内都可访问。private 是当前类内可访问。...(在一个.swift 中有多个类的情况下,就能体现出 fileprivate 和 private 的区别)。 internal是swift 文件的默认权限,在当前模块内可访问,模块外不能访问。...Swift中 Protocol 如何声明可空 optional MVP 的优点是什么 MVP 是 Model管理数据,View 负责展示,Presenter 负责管理业务逻辑,View 通过接口与 Presenter...MVP 的优点是: 模型与视图分离,从而改变视图的时候不会影响模型 可以更高效的使用模型,所有的交互都发生在 Presenter 内部 可以将一个 Presenter用于多个视图,不需要改变 Presenter...RxSwift 中 CombineLatest、zip、merge的区别 merge 是把多个序列合并成一个,当任一个序列发送事件时,合并后的序列就发送。

    9310

    界面之下:还原真实的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,就像一个打怪升级的过程。

    62220

    48 条高效率的 PHP 优化写法

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

    83930

    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

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

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

    42130

    48 条高效率的 PHP 优化写法

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

    99040

    带你解析Dagger2

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

    75040

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

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

    65300

    再探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.2K20

    在项目中怎么灵活使用Dagger?

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

    87020

    打造完备的iOS组件化方案:如何面向接口进行模块解耦?

    当调用一个模块时,怎么能保证这个模块一定存在?直接引用类时,如果类不存在,编译器会给出引用错误,但是动态组件就无法在静态时检查了。...Swift 中使用未声明的 protocol: Objective-C 中使用未声明的 protocol: 这个特性通过两个机制来实现: • 只有被声明为可路由的 protocol 才能用于路由,否则会产生编译错误...获取模块时,返回值是一个id类型,使用者需要手动指定返回变量的类型,在 Swift 中更是需要手动类型转换,而这一步是可能出错的,并且编译器无法检查。...声明了泛型参数后,我们可以在方法中的参数声明中使用泛型: @interface ZIKViewRouter是指两个对象互相依赖。 在 router 内部动态注入依赖时,如果注入的依赖同时依赖于被注入的对象,则必须在 protocol 中声明。

    7.8K43

    字节前端二面高频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
    领券