Fire Event执行多次。钛机器人

时间:2012-03-20 05:54:18

标签: android event-handling titanium-mobile

我正在使用Titanium,android sdk 1.8.0.1开发android应用程序。在我的应用程序中有三个tabs.Every当我点击tab我的窗口得到刷新。所以我的代码结构看起来像:

////// 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次等等一段时间后它强行关闭app.I认为窗口的事件监听器在刷新寡妇后仍然打开。所以有什么方法可以解决这个问题。谢谢你

1 个答案:

答案 0 :(得分:4)

这里有一个内存泄漏。 使用语句

将事件侦听器添加到Ti.App时
Ti.App.addEventListener('feed_partial_action',function(e)
{
   alert('inside event')
});

该匿名函数存储在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); 
    });