最近,我使用 Eclipse 使用 Scala 编写了一些 Android 应用程序。 一切都很好,直到我的程序只有几节课/Activity 。 当我添加更多代码时,JVM 开始崩溃,eclipse 经常死机,adb 不断失去连接。任务管理器显示 Java 进程正在占用 800 到 1300 MB 的内存!
我的电脑硬件参数不错,i7 3rd gen, 8GB DDR3 和 SSD 256。 所以这不是原因。
我的软件也是最新的,包括最新版本的 Eclipse、Android SDK、Scala 和 Java 开发工具包,以及所有用于 eclipse 的插件。 -vmargs 是为 scala 开发配置的,但它根本没有帮助。 所以我将其作为问题的原因消除了。
当我用 Java 重写我的代码时,一切都很顺利,我可以继续我的项目。
有没有人找到在 Android 项目中使用 scala 的解决方案?我在这里和谷歌群组上阅读了几个类似的主题,但没有关于这个问题的答案。
编辑:
我使用 visual vm 分析了我的代码,但堆空间使用情况正常。 这是我的一些代码 fragment 。
imports ...
class MainActivity extends FragmentActivity {
private lazy val timePicker = findViewById(R.id.timePicker).asInstanceOf[TimePicker]
private lazy val spinner_sourceBank = findViewById(R.id.spinnerSource).asInstanceOf[Spinner]
private lazy val spinner_targetBank = findViewById(R.id.spinnerDestination).asInstanceOf[Spinner]
private lazy val myApplication = getApplication.asInstanceOf[MyApplication]
private var ignoreTimeChange = false
override protected def onCreate(savedInstanceState: Bundle) = {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
timePicker.setIs24HourView(true)
initializeSpinner(spinner_sourceBank)
initializeSpinner(spinner_targetBank)
}
private def initializeSpinner(spinner: Spinner) = {
val adapter = ArrayAdapter.createFromResource(this, R.array.banks, R.layout.spinner_item)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.setAdapter(adapter)
}
def reset(w: View) = {
timePicker.setCurrentHour(13)
timePicker.setCurrentMinute(00)
spinner_sourceBank.setSelection(0)
spinner_targetBank.setSelection(0)
}
def submit(w: View) = {
if (spinner_sourceBank.getSelectedItemPosition == 0 || spinner_targetBank.getSelectedItemPosition == 0) {
new AlertDialog.Builder(this).setPositiveButton("OK", new OnClickListener {
override def onClick(dialog: DialogInterface, which: Int) { dialog dismiss }
}).setMessage(getString(R.string.alert_title)).setTitle("Alert Dialog").setIcon(android.R.drawable.ic_dialog_alert).create.show
} else manageFragments(sourceBank, targetBank)
}
def manageFragments(sourceBank: String, targetBank: String) = {
val fragmentTransaction = getSupportFragmentManager.beginTransaction
if (targetBank == sourceBank) myApplication.setCurrentFragment(MyApplication.NOW)
else myApplication.setCurrentFragment(MyApplication.FIRST_SESSION)
fragmentTransaction.replace(R.id.fragment_container, myApplication.getCurrentFragment)
fragmentTransaction.commit
}
override def onCreateOptionsMenu(menu: Menu): Boolean = { getMenuInflater.inflate(R.menu.activity_main, menu); true }
}
我可以在移动设备上测试我的应用程序,它运行得很好。我也可以编写代码,但 eclipse 的表现就像在旧计算机上运行一样 - 切换选项卡需要花费大量时间,因此需要花费大量时间进行构建和部署。
最佳答案
将这些添加到 eclipse.ini(或编辑如果存在),因为它们更适合 Scala 开发: 它们应该出现在 eclipse 条目下面,例如 -vm:
-Xverify:none
-Dosgi.requiredJavaVersion=1.6
-Xms900m
-Xmx900m
-Xss2m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:MaxGCPauseMillis=20
-XX:MaxHeapFreeRatio=70
-XX:+ScavengeBeforeFullGC
-XX:+UseParallelOldGC
-XX:+UnlockExperimentalVMOptions
-XX:+UseFastAccessorMethods
-XX:ReservedCodeCacheSize=128m
-XX:+TieredCompilation
-XX:+AggressiveOpts
可能不太可能,但如果您正在使用 CMS GC,请从文件中删除对它的引用。
关于Android、scala 和 eclipse = 不稳定的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14039149/
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案
所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass
如何用HAML编写这个ERB:#OR我可以:=some_ruby_code+":"#and=some_ruby_code%br但我不想在这里连接,我想将它写成内联:(=some_ruby_code):#and(=some_ruby_code)%br 最佳答案 =some_ruby_code+":"-#and=some_ruby_code+""编辑1:我不确定您在寻找什么。你想要其中之一吗?==#{some_ruby_code}:-#and==#{some_ruby_code}或==#{some_ruby_code}:-#and=so
我正在尝试在Eclipse中从事流浪者/厨师项目。我对这两种技术都很陌生,对ruby有点生疏。我已经安装了rdt并且有一个带有代码的ruby项目。然而,eclipse似乎并不理解gems是必需的。有没有办法让rubygems和eclipse一起玩得很好。我以为我可以将gems添加为库,但这似乎不起作用。 最佳答案 我在让Eclipse识别我安装的gem时遇到了一个非常相似的问题。我使用的是rvm,默认指向ruby2.1.0。我正在调试的ruby代码在顶部有一个require'mail'。运行或调试脚本时,控制台报错:
我正在为不同的应用程序使用多个ruby实例和gemset进行开发。为了在我的ruby版本和gemset之间切换,我使用.rvmrc文件。我还使用带有radrails插件的Eclipse作为我的开发工具。有什么方法可以让eclipse使用rvm在不同的gemsets和ruby版本之间自动切换? 最佳答案 Gointoyourprojectdirectoryandcreateafilecalled.rvmrccontainingtheline:rvmuseruby-1.8.7-p330@testing--default(or
如何稳定地对数组进行排序?我要排序的值可能有很多重复项,我不确定ruby使用哪种排序算法。我认为插入排序最适合我。示例:a=[[:a,0],[:b,1],[:c,0],[:d,0]]a.sort_by{|x,y|y}#=>[[:a,0],[:d,0],[:c,0],[:b,1]]寻找[[:a,0],[:c,0],[:d,0],[:b,1]] 最佳答案 把你原本想排序的键和索引放到一个数组中,然后排序。a.sort_by.with_index{|(x,y),i|[y,i]}#=>[[:a,0],[:c,0],[:d,0],[:b,