2010-08-15 8 views
6

Próbowałem już różnych metod, aby utworzyć natywną aplikację natywną za pomocą Phonegapa i uzyskać ogólne porady dotyczące rozwiązywania problemów.Ostrzeżenia dotyczące pamięci/upaść za pomocą aplikacji PhoneGap na iPad

Pierwsze podejście: Jest to w zasadzie kilka różnych stron i podstron ładowane z jQuery do pojemników, które żyją na stronie indeksu. Tak więc żadna strona nie ładuje się, tylko ładuje fragmenty stron ze stron do powłoki, używając .load().

Drugie podejście: Zrobiłem jedną stronę html strony z całą zawartością, a następnie pokazać i ukryć, że na podstawie dopasowania klasę elementu nawigacyjnego do id zawartości pojemnika.

Oba podejścia działają dobrze mechanicznie. Problem polega na tym, że wszystkie moje podstrony mają galerię lub 2-6 zdjęć (mam łącznie ponad 215 zdjęć, 660 x 440), dla których użyłem cyklu jquery, i Touchwipe, aby aktywować przewijanie za pomocą gestów. Galerie działają dobrze, ale po przewinięciu około 35 galerii aplikacja zawsze otrzymuje komunikat ostrzegawczy o poziomie 1, a następnie 2, a następnie zawiesza się. Moje użycie pamięci w instrumentach wydaje się ok ... wersja z ładowanym fragmentem ajax pozostaje około 2 megabajtów na żywo, jeden pager utrzymuje się na poziomie około 5 megapikseli. Galerie składają się z obrazów tła CSS w elementach div, ponieważ wydawało się, że działają lepiej niż znaczniki.

Nie widzę żadnych wycieków pamięci ani żadnych innych problemów poza ostrzeżeniami dotyczącymi pamięci. Trochę utknąłem na tym, jak to wyśledzić. Zrobiłem próbę i błąd całkowicie na śmierć. Zredukowaliśmy javascript do podstawowych rzeczy. Coś zdaje się narastać w miarę upływu czasu.

Wszelkie pomysły, jak dowiedzieć się, co się dzieje? Czy są jakieś pierwsze podejścia, aby upewnić się, że nic się nie dzieje z javascriptem, który powoduje jakiś wyciek pamięci?

To bardzo frustrujące, że całość działa całkiem dobrze, z wyjątkiem iPada.

Moja następna taktyka może polegać na przepisywaniu obrazów tła galerii na pusty GIF, gdy nie są używane.

Oto kod używam dla jednej pager:

$(document).ready(function(){ 

    document.addEventListener('touchmove', function(e){ e.preventDefault(); }); 

    $('div#mainpages > div').hide(); 

    $("ul#mainnav li").click(function() { 
     $("#mainpages > div").hide(); 
     var navClass = $(this).attr('class'); 
     var target='#'+navClass; 
     $(target).show(); 
     $('[id^=subpages] > div').hide(); 
     $(target).find('[id^=subpages_] div:first').show(); 
    }); 


    $('[id^=subnav] li').click(function() { 

     $('[id^=subnav_] li').removeClass('current'); 
     $('[id^=subpages_] > div').hide(); 

     var subnavClass = $(this).attr('class'); 
     var subtargeted='#'+subnavClass; 
     $(subtargeted).show(); 

     $(this).addClass('current'); 

     $(subtargeted+' .gallery_div_shell').cycle({ 
      timeout: 0, 
      speed: 700, 
      speedIn: 300, 
      speedOut: 300, 
      fx: 'scrollHorz' 
     }); 

     $(subtargeted+' .gallery_div_shell').touchwipe({ 
      wipeLeft: function() { 
       $('.gallery_div_shell').cycle("next"); 
      }, 
      wipeRight: function() { 
       $('.gallery_div_shell').cycle("prev"); 
      } 
     }); 
    }); 
}); 

Dzięki za wszelkie rady, jestem ciągnięcie moich włosów.

Odpowiedz

1

Na pierwszy rzut oka nie widzę niczego złego. Można spróbować jawnie zniszczyć jQuery galerii Cycle po otwarciu następnego i zobacz czy to pomaga

$(youridentifier).cycle('destroy'); 
+0

Dzięki za spojrzenie, też tego próbowałem. Najpierw dodałem klasę do bieżącej galerii, coś w rodzaju ".active_gallery", następnie specjalnie zniszczę tę konkretną galerię "cyklu" pierwszą rzeczą w zdarzeniu kliknięcia nawigacji, a następnie usuń klasę przed przejściem przez cały kod, który konfiguruje nowa galeria bieżącego cyklu. Jeszcze nie miał szczęścia. Wydaje się, że nie ważne co, po przejściu przez 35 galerii, zaczyna otrzymywać ostrzeżenia o pamięci. Dzięki aplikacji ładującej ajax uzyskuję ten sam wynik, nawet po zniszczeniu galerii cyklu, usunięciu programów do usuwania "wytrzeć" itp. – Transoptic

2

Myślę, że problem nie był związany z javascript, ale związana z ilością obrazów WebKit może utrzymać w aktywny pamięć. Wydaje się, że jest to powiązane z tym pytaniem: Crashing when loading images

Moje rozwiązanie polegało na wykorzystaniu kombinacji wymienionych tam rzeczy. Przede wszystkim używam divów z obrazem tła dla moich galerii. Po drugie, zaczynam od wszystkich obrazów tła, które mają być puste GIF. Kiedy pokażę podsekcję i aktywuję galerię, używam jquery do przepisania obrazu tła css do faktycznego źródła obrazu, a kiedy klikam nowe podrzędnie, resetuję je, aby użyć pustego GIF-a. Wydaje się, że liczba "aktywnych" obrazów tła div wynosi tylko od 3 do 7 na raz, poza interfejsem gfx. W międzyczasie pozostałe 200 elementów z obrazami tła w galeriach (i tak nie jest wyświetlane) jest po prostu pustym gifem.

Myślę, że ten problem jest ogólnie związany z ograniczeniami w UIWebview, a nie z czymś charakterystycznym dla PhoneGap lub jquery. Nie jestem pewien, że to jest ostateczne rozwiązanie, ale jestem w stanie uruchomić aplikację bez awarii do tej pory, a moje bajty na żywo w Allocations Instrument utrzymuje się stale około 1,3 megapiksela.