我正在使用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认为窗口的事件监听器在刷新寡妇后仍然打开。所以有什么方法可以解决这个问题。谢谢你
答案 0 :(得分:4)
这里有一个内存泄漏。 使用语句
将事件侦听器添加到Ti.App时Ti.App.addEventListener('feed_partial_action',function(e)
{
alert('inside event')
});
该匿名函数存储在Ti.App上下文中(它必须保留对该函数的引用,以便在触发“feed_partial_action”事件时可以调用它)。在Ti.App释放对它的引用之前,该函数不会被垃圾收集。此外,它仍然与事件有关。
有几种方法可以解决这个问题。我不知道如何告诉您如何解决问题,因为我没有提供代码示例的大量上下文。所以,这里有一些解决方案。如果以下假设之一不正确,请提供更多详细信息。
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);
});