Память предупреждения / сбой с приложением PhoneGap iPad - PullRequest
6 голосов
/ 15 августа 2010

Я пробовал несколько подходов, чтобы создать одностраничное приложение с помощью Phonegap, и ищу несколько общих советов по устранению неполадок.

Первый подход: В основном это куча разных страниц и подстраниц, загружаемых с помощью jquery в контейнеры, которые находятся на странице индекса. Таким образом, страница не загружается, просто загружая фрагменты страниц из страниц в оболочку, используя .load ().

Второй подход: Я создал одностраничную html-страницу со всем содержимым, затем показал и скрыл ее, основываясь на сопоставлении класса элемента навигации с идентификатором контейнера содержимого.

Оба подхода работают нормально механически. Проблема, похоже, заключается в том, что все мои подстраницы имеют галерею или 2-6 изображений (так что я получил в общей сложности более 215 изображений, 660 x 440), для которых я использовал цикл jquery, и Touchwipe для активации прокрутки с помощью жестов. Галереи работают нормально, но после некоторой прокрутки около 35 галерей приложение всегда получает предупреждение памяти уровня 1, затем 2, а затем вылетает. Мое использование памяти в инструментах кажется нормальным ... версия фрагмента, загруженная ajax, остается в живых около 2 мегабайт байтов, одностраничная версия остается неизменной на уровне около 5 мегабайт. Галереи состоят из CSS-фоновых изображений в div, так как это работает лучше, чем теги.

Я не вижу никаких утечек памяти или каких-либо других проблем за пределами предупреждений памяти. Я застрял на том, как отследить это. Я сделал проб и ошибок абсолютно до смерти. Сократили JavaScript до самого необходимого. Кажется, что-то со временем накапливается.

Есть идеи, как выяснить, что происходит? Существуют ли какие-то первые подходы, чтобы убедиться, что с javascript ничего не происходит, что вызывает некоторую утечку памяти?

Очень печально, что все работает довольно хорошо, кроме как на iPad.

Моей следующей тактикой может быть попытка переписать фоновые изображения галереи в пустой GIF, когда они не используются.

Вот код, который я использую для одностраничного пейджера:

$(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");
            } 
        });  
    });
});

Спасибо за любой совет, я вырываю волосы.

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

Я думаю, что проблема не связана с javascript, но связана с количеством изображений, которые веб-набор может поддерживать в активной памяти.Кажется, это связано с этим вопросом: Сбой при загрузке изображений

Мое решение заключалось в использовании комбинации вещей, упомянутых там.Прежде всего, я использую div с фоновым изображением для моих галерей.Во-вторых, я начинаю со всех фоновых изображений, настроенных как пустой GIF.Когда я показываю подраздел и активирую галерею, я использую jquery для перезаписи фонового изображения css в фактический источник изображения, затем, когда я щелкаю новую подссылку, я сбрасываю ее, чтобы использовать пустой GIF.Похоже, это позволяет сохранить количество «активных» фоновых изображений div только до 3-7 за один раз, кроме интерфейса gfx.Между тем остальные 200 или около того div с фоновыми изображениями в галереях (в любом случае не показаны) являются просто пустым GIF.

Я думаю, что эта проблема в целом связана с ограничениями в UIWebview, а не с чем-то специфичным для PhoneGap или jquery.Я не уверен, что это окончательное решение, но я могу запустить приложение без сбоев до сих пор, и мои живые байты в инструменте распределения постоянно остаются в пределах 1,3 мегабайта.

1 голос
/ 15 августа 2010

На первый взгляд я не вижу ничего плохого.Вы можете попытаться явно уничтожить галерею jQuery Cycle, когда откроете следующую и посмотрите, поможет ли это

$(youridentifier).cycle('destroy');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...