Titanium Mobile Android:关闭应用程序时未释放内存

问题描述:

我们开发了一款使用Titanium Mobile的应用程序。当我们第一次在Android设备上运行应用时,它使用大约25MB的内存。但是,每次我们使用设备后退按钮退出应用程序,然后重新启动应用程序时,内存使用量将增加10MB。因此,如果我们退出并重新启动应用5次,该应用最终会使用50MB的额外内存,总共使用75MB。如果我们多做几次启动应用程序,该应用程序将根本无法启动,并出现以下错误被抛出:Titanium Mobile Android:关闭应用程序时未释放内存

Uncaught Error: Failed to load resource, Java exception was thrwon. Source = assets.readAsset(assetPath);

我们最初以为是我们的应用程序的问题,所以我们开发了一个简单的应用程序进行测试问题。这个测试应用程序只是创建一个窗口,并添加一个标签。该app.js如下:

function createView() { 

    var win1 = Titanium.UI.createWindow({ 
     title:'Tab 1', 
     backgroundColor:'#fff', 
     exitOnClose: true 
    }); 

    var label1 = Titanium.UI.createLabel({ 
     color:'#999', 
     text:'I am Window 1', 
     font:{fontSize:20,fontFamily:'Helvetica Neue'}, 
     textAlign:'center', 
     width:'auto' 
    }); 

    win1.add(label1); 

    win1.open();  
} 

createView(); 

好了,测试应用程序具有相同的问题,因为我们原来的应用程序。它首次启动时会消耗14MB的内存。重启5次后(使用设备后退按钮),它消耗21MB(原始内存的150%)。

我们还尝试了在Titanium中创建项目时生成的示例应用程序以及由Titanium开发的Kitchen Sink应用程序。结果是一样的。

我们的测试采用钛3.0.0.GA做有两个不同的设备:

  • HTC Desire Z的 - 的Android 2.3
  • 三星Galaxy 2 - 的Android 4.0

我们已搜查为解决这个问题没有结果。我们不想相信这是Titanium的正常行为,因为如果是这样,Titanium根本就不是我们的选择。有没有人找到解决此问题的解决方案?

在此先感谢

UPDATE:测试应用程序

<?xml version="1.0" encoding="UTF-8"?> 
<ti:app xmlns:ti="http://ti.appcelerator.org"> 
    <id>com.cloudship.titanium.mobile.test</id> 
    <name>titanium-mobile-test</name> 
    <version>1.0</version> 
    <publisher>Javier</publisher> 
    <url>http://</url> 
    <description>not specified</description> 
    <copyright>2013 by Javier</copyright> 
    <icon>appicon.png</icon> 
    <persistent-wifi>false</persistent-wifi> 
    <prerendered-icon>false</prerendered-icon> 
    <statusbar-style>default</statusbar-style> 
    <statusbar-hidden>false</statusbar-hidden> 
    <fullscreen>false</fullscreen> 
    <navbar-hidden>true</navbar-hidden> 
    <analytics>true</analytics> 
    <guid>18e506f3-02d4-4fb7-84b7-ff8d4c1fac82</guid> 
    <property name="ti.ui.defaultunit" type="string">system</property> 
    <iphone> 
     <orientations device="iphone"> 
      <orientation>Ti.UI.PORTRAIT</orientation> 
     </orientations> 
     <orientations device="ipad"> 
      <orientation>Ti.UI.PORTRAIT</orientation> 
      <orientation>Ti.UI.UPSIDE_PORTRAIT</orientation> 
      <orientation>Ti.UI.LANDSCAPE_LEFT</orientation> 
      <orientation>Ti.UI.LANDSCAPE_RIGHT</orientation> 
     </orientations> 
    </iphone> 
     <android xmlns:android="http://schemas.android.com/apk/res/android"> 
     <manifest> 
      <application android:debuggable="true"/> 
      <supports-screens android:anyDensity="true"/> 
     </manifest> 
    </android> 
    <mobileweb> 
     <precache/> 
     <splash> 
      <enabled>true</enabled> 
      <inline-css-images>true</inline-css-images> 
     </splash> 
     <theme>default</theme> 
    </mobileweb> 
    <modules/> 
    <deployment-targets> 
     <target device="iphone">false</target> 
     <target device="ipad">false</target> 
     <target device="blackberry">false</target> 
     <target device="android">true</target> 
     <target device="mobileweb">false</target> 
    </deployment-targets> 
    <sdk-version>3.0.0.GA</sdk-version> 
</ti:app> 

它是钛3.0.0.GA.错误请参阅杰拉票here。幸运的是它已经在3.0.2中修复了。

回答是在Titanium Q&A

我也开发钛的添加tiapp.xml。我查看了我的应用程序,并未在HTC Desire上遇到Android 2.2.2上的这些问题。该应用程序已正确关闭。

你可以用下面的代码进行测试:

var win1 = Titanium.UI.createWindow({ 
    title:'Tab 1', 
    backgroundColor:'#fff', 
    exitOnClose: true 
}); 

var label1 = Titanium.UI.createLabel({ 
    color:'#999', 
    text:'I am Window 1', 
    font:{fontSize:20,fontFamily:'Helvetica Neue'}, 
    textAlign:'center', 
    width:'auto' 
}); 

win1.add(label1); 

win1.open(); 

所以去除环境功能。

+0

感谢您的回答。这个问题在没有封闭函数的情况下仍然存在(我们将其包含在内以保持全局上下文清洁) – 2013-02-22 12:22:39

+0

我试图用你所描述的返回按钮关闭我的应用程序,但它并未从正在运行的应用程序列表中删除。你的应用程序是否一样? – 2013-02-22 13:08:54

+0

在HTC中,它会在几秒钟后从进程列表中删除。在银河II中它保存在列表中。在这两种情况下,当我再次启动应用程序时,该过程消耗的内存越来越多。 – 2013-02-22 13:14:05