jjzjj

安卓 : Where should a OnSharedPreferenceChangeListener be defined/registered

coder 2023-12-17 原文

基本上是设计问题 - 拥有一个 PreferenceActivity 应该让它实现 OnSharedPreferenceChangeListener 还是应该在另一个类中定义此功能 - 比如在内部类中?有什么理由让人更喜欢另一种方法吗?

还有应该在哪里注册监听器?我是说 the docs和常识要求分别在 onResume/onPause 中注册/取消注册,但已看到 a zillion registrationsonCreate 中,我只是想知道我是否遗漏了什么。

此外,我不太确定注销失败是否一定会导致泄漏(例如 here 可能不会调用注销,因为不能保证调用 onStop)。所以如果我有例如

class MyPref extends PreferenceActivity implements
            OnSharedPreferenceChangeListener {
    SharedPreferences sharedPreferences;
    // init sharedPreferences
    onStart(){
        sharedPreferences.registerOnSharedPreferenceChangeListener(this);
    }
    // no unregistration
}

一旦我返回我的其他 Activity 之一,这会泄漏 MyPref 实例吗?

最后 - 同样的考虑是否适用于 OnPreferenceChangeListener

编辑:回到我认为没有办法真正取消注册 OnPreferenceChangeListener - 我是瞎了吗??

最佳答案

除了个人偏好之外,我认为没有任何主要原因可以让听众喜欢某个特定的位置。让 Activity 实现它,或使用内部类(匿名或非匿名)都可以。

唯一的问题是,如果您不使用现有对象(如 Activity)作为监听器,则需要保留对监听器对象的引用。根据 this answer如果您不这样做,它将收集垃圾(因此实际上不会听任何东西)。


深入研究源代码后,似乎 SharedPreferencesImpl 使用 WeakHashMap 来包含已注册的监听器( source ,第 72-73、186-196 行),这意味着未能取消注册不会导致泄漏。

如您所说,文档建议使用 onResume()/onPause();这可能与泄漏无关,而是为了防止后台应用程序进行不必要的处理 - 所以仍然值得关注!

关于安卓 : Where should a OnSharedPreferenceChangeListener be defined/registered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604536/

有关安卓 : Where should a OnSharedPreferenceChangeListener be defined/registered的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 参数错误 : Factory not registered - 2

    我正在尝试使用FactoryGirl运行rspec,但我一直收到此错误:1)ProductsUpdatewithinvalidinformationFailure/Error:let(:product){FactoryGirl.create(:product)}ArgumentError:Factorynotregistered:product#./spec/requests/products_spec.rb:47:in`block(3levels)in'#./spec/requests/products_spec.rb:52:in`block(3levels)in'-这是有错误的测试

  3. ruby-on-rails - 工厂女孩/Rspec - "Trait Not Registered"错误 - 2

    跟随BenWalker的(惊人的)Let'sBuildInstagramWithRails,特别是BDD版本。教程使用FactoryGirl。我在多次测试中遇到以下错误:精简版Failure/Error:post=create(:post,user_id=user.id)ArgumentError:Traitnotregistered:1我什至无法让Ben用cloneofmyrepo重新创建错误,我在StackOverflow的“特征未注册”问题中找不到任何内容。这是我的第一个SO问题,所以如果我在那个前面做错了什么,请告诉我。在此先感谢您的帮助!代码选择:spec/factories

  4. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  5. ruby - 工厂女郎 : Factory not registered: user (ArgumentError) - 2

    在使用FactoryGirl将所有鸭子按正确顺序排列时遇到很多麻烦。设置极简Rails应用程序(3.0.11)、factory_girl_rails(1.4.0)、factory_girl(2.3.2)&cucumber-rails(1.2.1)和ruby​​-1.8.7-p352。cucumber测试是:Feature:aScenario:testfactory-girlGiventhefollowinguserexists:|name|email||Brandon|brandon@example.com|结果是这样的:cucumberUsingthedefaultprofile..

  6. 微信小程序安卓视频播放卡顿问题 - 2

    在微信小程序开发中遇到在video组件的两个问题1.安卓手机里播放视频会有明显的卡顿问题刚开始以为是网络问题,或者是视频文件问题。排查了一下发现都没问题最后加了个属性就OK了uniapp和原生小程序方法:custom-cache="false"custom-cache={{false}}video组件兼容iOS手机custom-cache加了这个属性会让2.iOS手机第一次播放视频会有几秒黑屏问题因此我加了当前手机型号的判断uni.getDeviceInfo().deviceType获取当前设备api当为iPhone时不加custom-cache属性,否则加上custom-cache=“fal

  7. javascript - JS文件中的System.register是什么意思? - 2

    在Angular2中使用指令时,JS文件中的System.register是什么意思。 最佳答案 我认为这个问题并不特定于angular2中的指令,它是关于ES6、TypeScript和其他使用SystemJS的现代编译器的一般问题。简短的回答-它是由System.js创建的包装器,用于隔离代码并注入(inject)外部依赖项。这段代码:import{pasq}from'./dep';vars='local';exportfunctionfunc(){returnq;}exportclassC{}将生成:System.registe

  8. 安卓渐变的背景框实现 - 2

    安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景万恶的设计小姐姐又来搞事情啦,你说好好的设计一个纯色的背景框框不好嘛,非要把一个框框弄成渐变的,如果不拿出放大镜估计没几个人能看出来它是渐变的。来,我让你看看是啥样框子是从左到右渐变的,设计应该是做了一个底图,然后上面盖了一个白色圆角矩形。那么我们该怎么去实现它呢?实现方法下面介绍三种实现它的方法。先贴上源码地址,大家记得给个starhttps://git

  9. javascript - jQuery 与 Prototype 的 Ajax.Responders.register 的等价物是什么? - 2

    是否有与此原型(prototype)代码等效的jQuery?Ajax.Responders.register({onException:function(x,y){if(y.message!="Syntaxerror")newInsertion.After("toperrorbox",""+y.message+"");}}); 最佳答案 Prototype的Ajax.Responders是监听所有ajax事件的全局监听器。jQuery确实有一个等价物。全局AjaxEvents.由于jQuery的性质,语法略有不同,但与此类似的东西应

  10. javascript - EmberJS 重置警告 : Library is already registered with Ember - 2

    一些背景...我们有一个ASP.NET应用程序,我们正在慢慢将其转换为EmberJS。我们有一个为网站的某些部分实例化的Ember应用程序。当我们迁移页面时,他们会在Ember应用程序中获取路由。目标是随着时间的推移让所有东西都在Ember中。在此期间,用户可以单击将他们带回ASP.NET部分的链接。我们的问题是,如果用户单击返回返回Ember或单击将他们带回Ember部分的新链接,则会重置Ember应用程序的状态。我们已经尝试在应用程序上调用.reset,但这样做会给我们一个错误,说明以下内容。我们的应用程序称为ConsoleCli而不是标准应用程序。Library"ConsoleC

随机推荐