0

使用 phonegap 2.9.0,使用此回调读取文件:

    fBrowse.params.on_file_select = function(file){     // file: FileEntry  
        try{
            var reader = new FileReader();
            jsIQ.msg('loading game!..');
            reader.onload = function(evt) {
                // success
                var game = null;
                // remove garbage from string
            jsIQ.msg('loading game!3..' + arguments.length);
            jsIQ.msg('loading game!3/2: ' + evt.target.result);
            //jsIQ.msg('data: ' + evt.target.result, 2);
                var s = $.trim(B64.decode(evt.target.result));
            jsIQ.msg('loading game!4..');
                s = s.substr(0, s.indexOf('}')+ 1);
            jsIQ.msg('loading game!5..');
                game = JSON.parse( s );
                if (game != null) {
                    // success!
                    $('#fBrowse').hide();
                    jsIQ.msg('Load game success', 2);
                    jsIQ.triggerEvent('heart_game_loaded', {data: game});
                }
            };
            reader.onerror = function(){
                alert('error reading file');
            };
            jsIQ.msg('loading game!2..');
            file.file(function(f){
                reader.readAsText(f);
            }, function(){
                alert('Error opening file');
            });
        } catch (e){
            jsIQ.msg('loadgame err: ' + e.message, 2);
            alert('Внутренняя ошибка');
        }
        //return true;
    };

我看到了这个日志文件内容:

...

[-] 17:1:26.257 加载游戏文件:/mnt/sdcard/heartofice/heartofice2.savegame

[-] 17:1:26.260 加载游戏!..

[-] 17:1:26.262 加载游戏!2..

[-] 17:1:26.270 加载游戏!3..1

这意味着,与

evt.target.result

在没有任何通知的情况下出现错误!“evt”已传递给成功读取回调,但我不能使用它??

这发生在真正的 android 设备 (4.0.3)

尝试使用 onload 回调中的“reader.result”,但行为相同!

如何解决这个问题?

4

1 回答 1

0

我找到了一个解决方案:

jsIQ.msg 使用 FileWriter 将数据写入日志

所以,当我“得到一个文件”时,我向它发送消息以记录 - 这会破坏“已读文件”的链接,并且它变得过时了。

因此,永远不要使用组合:

  1. 获取文件#1 进行读取
  2. 获取文件#2 进行写入,写入
  3. 读取文件#1

这种行为的原因尚不清楚......

于 2013-09-16T08:51:21.193 回答