我是 Android/Java 的新手(通常使用 PHP 和 JavaScript)。我读过几篇关于当引用被错误使用时应用程序内存泄漏问题的文章,所以我对我在其他人的工作中经常看到的东西有疑问。
很多人,当他们需要以多种方法访问诸如 View 之类的东西时,会在创建 Activity 期间分配的属性中保留对此的引用。从我读过的(或者至少理解我读过的)来看,这是内存泄漏的类(class)之一?
为对象分配一个ID,然后在每个方法中搜索它们是否更好?如果是这样,那么动态创建的对象呢?
最佳答案
如果你正确地使用它们会很好,如果你不正确的话就会很糟糕。
只有当您将 Activity 之外的内容传递给另一个类并且该类的生命周期大于 Activity 的生命周期时,才会发生泄漏。一旦 Activity 不再是前台 Activity,并且如果 Activity 之外的某些东西持有对它的引用,Android 可能会销毁它,那么垃圾收集器就无法将内存释放回堆中。
要特别注意 Activity 上下文、静态和单例。
简单地在 Activity 中保留对 View 的引用是绝对正常的。
这里有一个不好的例子(伪代码);
public class MyApplication extends Application{
public static ImageView activityBackgroundImageView;
}
public class MyActivity extends Activity{
ImageView iv = findViewById(R.id.myImageView);
myApplication.activityBackgroundImageView= iv; // <==== LEAK
}
实际上,泄漏并不存在,它仅在(如果)myActivity 完成()或销毁时泄漏。
每个对象都有一个引用计数——有多少对象持有对它的引用。在您的 Activity 中设置对 ImageView 的引用后,引用计数为 1。然后将该引用复制到 Application 类。注意。 Java 中的所有内容都是按值传递的,因此您传递引用的值,恰好是该值的副本 - 即对同一对象的新引用。 ImageView 上的引用计数现在是两个。
一段时间后,您 finish() 您的 Activity 并且引用计数减少。现在是一个。垃圾收集器无法释放该 ImageView 对象,因为它具有非零引用计数。
当然,您可以通过使应用程序中的引用为空来修复它,但您现在有意大利面条代码。
关于android - 包含引用好/坏的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13703400/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP