Приложение Titanium Appcelerator для iPhone - происходит сбой приложения при прокрутке таблицы рядом с 1000-й записью и замедление при запуске прокрутки - PullRequest
0 голосов
/ 06 июля 2011

У нас есть пример приложения, которое загружает 10 записей из базы данных и показывает в виде фиев.Следующие десять записей принимаются, когда прокрутка достигает дна (как пример динамического представления прокрутки в кухонной раковине и после того же примера кода).Однако прокрутка приложения становится все медленнее и медленнее, когда увеличивается количество записей, а затем происходит сбой, когда мы показывали близкую к 1000-й записи.У нас есть еще записи для отображения (10000), и во всех строках показано изображение 50X50 и два текста.

if (search.value != null && search.value != ''){
    dbrows = db.execute('select id, name, scientificname from siteRecords where name            like \'%' + search.value + '%\' order by commonname limit 10 offset ' + lastRow);
}else{
    dbrows = db.execute('select id, name, scientificname from siteRecords order by name    limit 10 offset ' + lastRow);
}

tsEnd = new Date;
var duration = tsBegin.getTime() - tsEnd.getTime();
perfTableView.appendRow({title:"To fetch the record from 0 to " + (lastRow + 20) + " took: " + duration + " ms"});

tsBegin = new Date;
var rowCount = 0;
while (dbrows.isValidRow()) {
    var row;

    if( dbrows.fieldByName('name')[0] != curheader || initHeader == 0){
        initHeader = 1;
        curheader = dbrows.fieldByName('name')[0];
        row = Ti.UI.createTableViewRow({height:55,backgroundColor:'#ffffff',backgroundSelectedColor:'#eeee33',hasChild:true,className:'birds',header:curheader});
        index.push({title:curheader,index:rowNumber });
    } else {
        row = Ti.UI.createTableViewRow({height:55,backgroundColor:'#ffffff',backgroundSelectedColor:'#eeee33',hasChild:true,className:'birds'});
    }

    var lblBirdID = Ti.UI.createLabel({
        text: dbrows.fieldByName('id'),
        color: '#000000',
        textAlign:'left',
        left:4,
        top:8,
        height:100,
        font:{fontWeight:'bold',fontSize:10},
        visible:false
    });
    row.add(lblBirdID);

    media = dbrows.fieldByName('scientificname').replace(' ', '_') + '.jpg';
    var path = Titanium.Filesystem.resourcesDirectory + 'Birds/images/'

    if (Titanium.Filesystem.getFile(path,media).exists())
    {
        var f;

        if (isAndroid){
            f = '../images/' + media;
        }else{
            f = Ti.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory,'Birds/images/' + media);
        }

        var imgBird = Ti.UI.createImageView({
            image:f,
            left:4,
            height:50,
            width:50
        });
        row.add(imgBird);
    }else{
        var f;

        if (isAndroid){
            f = '../images/no_bird.jpg';
        }else{
            f = f = Ti.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory,'Birds/images/no_bird.jpg');
        }

        var imgBird = Ti.UI.createImageView({
            image:f,
            left:4,
            height:50,
            width:50
        });
        row.add(imgBird);
    }

    var lblBirdName = Ti.UI.createLabel({
        text: dbrows.fieldByName('name'),
        color: '#000000',
        textAlign:'left',
        left:60,
        top:8,
        height:20,
        font:{fontWeight:'bold',fontSize:16}
    });
    row.add(lblBirdName);

    var lblBirdScientificName = Ti.UI.createLabel({
        text: dbrows.fieldByName('scientificname'),
        color: '#000000',
        textAlign:'left',
        left:60,
        top:26,
        height:20,
        font:{fontSize:11}
    });
    row.add(lblBirdScientificName);

    birdRows[rowNumber] = row;
    rowCount = rowCount + 1;
    rowNumber = rowNumber + 1;
    dbrows.next();
}
dbrows.close();
db.close();

if (rowCount == 20){
    lastRow = lastRow + 20;
}else{
    lastRow = lastRow + rowCount;
}

birdTableView.setData(birdRows);
birdTableView.index = index;

tsEnd = new Date;
duration = tsBegin.getTime() - tsEnd.getTime();
perfTableView.appendRow({title:"To loop through the DB rows and to create table rows took: " + duration + " ms"});

}

1 Ответ

2 голосов
/ 06 июля 2011

Вы пробовали выгружать предметы сверху, так как предметы добавляются снизу (и наоборот)? Выполнение чего-либо подобного означало бы, что в каждый момент времени не может быть более 100 строк.

Также, если возможно, используйте стандартную строку вместо пользовательской строки. Стандартный ряд НАМНОГО более производительный, чем пользовательский.

...