2012-09-24 183 views
0

我正在读取SD卡上的图像并将其显示在我的phonegap应用程序库中。 我有两个文件夹正在读取内容。一个是同步文件夹和一个非同步文件夹。 的代码如下: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卡读取。 当我点击图库视图时,加载图像需要很长时间。 有没有什么办法可以让它响应更快,并提高性能?

回答

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

我还没有测试过此代码。如果您看到错误,您可能需要对其进行微小的修改。

+0

非常感谢。性能似乎有了很大的提高。我有几个疑问pls.Query 1:我们不能在listGalleryContents()里面有setTimeout;像线程这样的东西,以便我填充imagesArray很少的值,并调用onComplete();然后剩余的人口发生在后台?查询2:setTimeout(function(),0)有什么用处?在loadUnSynchedFolder()和allFoldersLoaded()内部,因为只有一个方法被调用。它是否虽然控制返回allFoldersLoaded()它不会调用showGalleryPage();?谢谢 – namrathu1

+0

我会先回答您的“查询2”:setTimeout(function(){},0)允许浏览器在“它可以”时执行排队操作,并且不会强制它在特定时间内执行。 – praneetloke

+0

至于你的“查询1”:避免关闭是一个好习惯,这就是为什么我把成功处理程序带到自己的功能。成功处理程序将在最常见的情况下被调用,这就是为什么我将错误处理程序关闭(内联)保持原样。 – praneetloke