2012-03-20 48 views
1

我开发与钛的Android应用程序,Android SDK中1.8.0.1.In我的应用程序有三个tabs.Every时间当我点击选项卡我的窗口得到refreshed.So我的代码结构看起来像:火灾事件多次执行。钛的Android

////// on tab click ///////////////////// 
var explore = Titanium.UI.createWindow(
{ 
    //navBarHidden:true, 
    backgroundColor:'#f8f8f8' 
});explore.open({animated:true}); 

    ////// m.js ///////////////// 
var explore = Titanium.UI.currentWindow; 
Ti.App.addEventListener('feed_partial_action',function(e) 
{ 
    alert('inside event') 
}) 
var new = Titanium.UI.createButton(
{ 

});explore.add(new); 
new.addEventListener('click', function(e) 
{ 
    var explore_new = Titanium.UI.createWindow(
    { 
    navBarHidden:true, 
    backgroundColor:'#f8f8f8' 
    });explore_new.open({animated:true}); 

}); 

    /////// explore_new.js///////////////// 
var explore_new = Titanium.UI.currentWindow; 
Ti.App.fireEvent('feed_partial_action',{page_type:'new'}); 

所以我的问题是,第一次加载警报内部事件列表中的m.js执行一次,但是当我再次调用m.js它显示警报两次。第三次它显示警报3次等,一段时间后强烈关闭应用程序。我认为窗口的事件监听器仍然在刷新widow后打开。那么有没有什么办法来解决这个问题。谢谢

+0

你如何通过你的窗口的标签?为什么你每次探索开放窗口? – 2012-03-20 07:48:35

+0

在标签上单击我正在执行打开的窗口。我只是编辑问题。 – nilkash 2012-03-20 07:56:22

+0

这是一个要求吗?因为如果您使用选项卡,则无需打开窗口。只需将窗口对象传递给选项卡。 – 2012-03-20 08:50:21

回答

4

你在这里有什么是内存泄漏。 当您与

Ti.App.addEventListener('feed_partial_action',function(e) 
{ 
    alert('inside event') 
}); 

这个匿名函数存储在Ti.App范围内的语句添加事件监听器Ti.App(它必须保留函数的引用,以便它可以在调用它“feed_pa​​rtial_action”事件被触发)。直到Ti.App发布它的引用之后,该函数才会被垃圾收集。此外,它仍然与事件挂钩。

有几种方法可以解决这个问题。我不知道如何告诉你如何解决你的问题,因为我没有很多上下文提供的代码示例。所以,这里有一些解决方案。如果以下假设之一不正确,请详细说明。

  • 如果“feed_pa​​rtial_action”事件是真正应该有一个且只有一个事件处理全球性事件,移动 Ti.App.addEventListener('feed_partial_action',function...);代码被执行多次块之外。
  • 如果您需要在探索窗口关闭时停止接收事件,请将eventHandler函数(匿名函数)移出到指定函数或变量,并在关闭窗口时调用Ti.App.removeEventListener('feed_partial_action', myFunction);。要做到这一点,最简单的方法是

    function feedPartialActionCB(e) { alert('inside event'); } 
    Ti.App.addEventListener('feed_partial_action', feedPartialActionCB); 
    explore.addEventListener('close', function() { 
        Ti.App.removeEventListener('feed_partial_action', feedPartialActionCB); 
    });