【问题标题】:Phonegap:Image Gallery loads very slowlyPhonegap:图片库加载非常缓慢
【发布时间】:2012-09-24 18:19:11
【问题描述】:

我正在从 sd 卡读取图像并将其显示在我的 phonegap 应用程序的图库中。 我有两个从中读取内容的文件夹。一种是同步文件夹和非同步文件夹。 代码如下:

 listGalleryContents(synchedsdcardfolder, function() {
    listGalleryContents(unsynchedsdcardfolder, function() {
        showGalleryPage();
    });
 });




function listGalleryContents(directoryEntry, onComplete) {
var directoryReader = directoryEntry.createReader();
directoryReader.readEntries(function(entries) { // success get files and folders
    for(var i=0; i<entries.length; ++i) {
        if(entries[i].name.indexOf(".") > 0 && entries[i].isFile) {
            imagesArray.push(entries[i].fullPath);
        }
    }
    onComplete();
} , function(error){ 
    alert("Error: = " + error.code);
});
}

当我从 SD 卡中读取的图像太多时,问题就出现了。 当我单击图库视图时,加载图像需要很长时间。 请问有什么方法可以使其响应更快并提高性能吗?

【问题讨论】:

    标签: javascript android jquery cordova android-sdcard


    【解决方案1】:

    Javascript 是单线程的,因此回调将在阻塞 UI 的同一主线程中触发。尝试将您的代码更改为:

    listGalleryContents(synchedsdcardfolder, loadUnSyncedFolder);
    
    function loadUnSynchedFolder() {
       setTimeout(function() {
           listGalleryContents(unsynchedsdcardfolder, allFoldersLoaded);
       }, 0);
    }
    
    function allFoldersLoaded() {
       setTimeout(showGalleryPage, 0);
    }
    
    function listGalleryContents(directoryEntry, onComplete) {
    var successCallback = onComplete;
    var directoryReader = directoryEntry.createReader();
    directoryReader.readEntries(
         function(entries) { readSuccess(entries, successCallback); } , 
         function(error){ 
            alert("Error: = " + error.code);
         });
    }
    
    function readSuccess(entries, onComplete) { // success get files and folders
        var i = 0, length = entries.length; 
        for(; i < length ; ++i) { // why are you using ++i and not i++ ??
            if(entries[i].name.indexOf(".") > 0 && entries[i].isFile) {
                imagesArray.push(entries[i].fullPath);
            }
        }
        onComplete();
       }
    }
    

    我没有测试过这段代码。如果您发现错误,您可能需要对其进行小幅修改。

    【讨论】:

    • 非常感谢。性能似乎提高了很多。我有几个疑问。请查询 1:我们不能在 listGalleryContents() 中设置 setTimeout;类似于线程的东西,以便我填充带有几个值的 imagesArray 并调用 onComplete();然后其余的人口发生在后台?查询2:在什么方面有 setTimeout(function(), 0);在 loadUnSynchedFolder() 和 allFoldersLoaded() 内部,因为其中只调用了一个方法。是不是虽然控件返回到 allFoldersLoaded() 它不会调用 showGalleryPage();?谢谢
    • 我会先回答你的“查询2”:setTimeout(function() {}, 0) 允许浏览器在“可以”时执行排队操作,而不是强制它在一定时间内执行时间。
    • 至于您的“查询 1”:避免关闭是一种很好的做法,这就是为什么我将成功处理程序取出到它自己的函数中的原因。在最常见的情况下将调用成功处理程序,这就是我保留错误处理程序闭包(内联)的原因。
    • 哦,非常感谢您的详细解释。非常感谢。
    • 我实现了这个并与我的客户分享。由于有一些延迟,他不满意:(。有什么我可以做的,所以没有等待期。我的画廊视图拆分为页面,在页面中显示一定数量的图像。当我点击下一步转到下一个图库页面,有时它会在大约 6 秒内没有响应,因为它会等待填充 imagesArray。你认为我可以做些什么来提高效率吗?谢谢
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多