Событие огня выполняется несколько раз. титановый андроид - PullRequest
1 голос
/ 20 марта 2012

Я занимаюсь разработкой приложения для Android с Titanium, android sdk 1.8.0.1. В моем приложении есть три вкладки. Каждый раз, когда я нажимаю на вкладку, мое окно обновляется. Поэтому моя структура кода выглядит следующим образом:

////// 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 раза и так далее, и через некоторое время оно принудительно закрывает приложение. Я думаю, что слушатель события окна все еще открыт после обновления вдовы. Так есть ли способ решить эту проблему. Спасибо

1 Ответ

4 голосов
/ 11 октября 2012

То, что у вас есть, это утечка памяти.Когда вы добавляете прослушиватель событий в Ti.App с оператором

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

Эта анонимная функция хранится в контексте Ti.App (она должна сохранять ссылку на функцию, чтобы она могла вызывать ее, когдасобытие «feed_partial_action» запускается).Эта функция не будет собирать мусор, пока Ti.App не выпустит ссылку на нее.Кроме того, он остается привязанным к событию.

Есть несколько способов справиться с этим.Я не знаю точно, как сказать вам, как решить вашу проблему, потому что у меня нет большого контекста с предоставленным примером кода.Итак, вот несколько решений.Если одно из приведенных ниже допущений неверно, просьба сообщить подробности.

  • Если событие feed_partial_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); 
    });
    
...