서버를 통해 전송받아서 잘 썼던거고, 안드로이드 sdk의 가상 에뮬레이터에서도 잘 돌아가는데,
갤탭을 연결해서 실제 디바이스에서 디버깅으로 돌려보면 저렇게 에러가 뜨더군요.
저건 json문장중 잘못된 문자열이 있으면 저렇게 에러가 나는걸로 아는데, 같은 데이터를 읽었는데도
유독 디바이스에서 에러가 나는 이유를 모르겠네요.
json 변환 이전에 openstream 으로 데이터가 잘 읽혀오는지 테스트 해봤는데 그 부분까진 문제가 없더군요.
에뮬레이터에서 정상적으로 동작하는 (특히나 파일 I/O 관련) 코드는 단말에서도 정상 동작해야 합니다.
(정말 이해하기 어려운 문제군요... ㅡㅡ;)
file에서 읽어들인 json 텍스트를 parsing하기에 앞서 눈으로는 확인해 보셨는지요?
그리고 혹시 다른 단말기에서 테스트해 보실 수 있을까요? (혹시나 갤럭시 탭의 버그? ^^)
json 파싱하기 전에 ax.log로 제대로 들어왔는지도 찍어 봤고요. 이부분까진 에뮬이나 갤탭이나 문제가 없는데
파싱 부분에서 본문의 문제가 생기더군요.
지금 당장 돌려볼 수 있는 디바이스가 갤탭뿐이라 oTL 다른데서 테스트를 못해보고 있네요.
그리고 혹시 listFiles로 디렉토리를 읽어와서 for문으로 돌면서 하위 디렉토리를 또 listFiles로 돌면서
json 관련 파일들을 위와같이 json 으로 파싱하며 읽어오는데, listFiles도 그렇고 openStream도 그렇고
콜백함수가 비동기 이다보니 for문이 다 돌고 나중에 콜백함수들이 전부 실행되서, 끝나는 시점을 알 수 없더군요.
위 행동이 모두 끝난후 바로 이어서 데이터를 화면에 출력하는걸 수행해야 하는데, 이런건 어떻게 처리해야할지
막막하네요 oTL
showFileAttributes 가 비동기 콜백이며, clouser 로 감싸 개별 내용을 화면에 뿌려줍니다.
이 펑션에서 json 파싱 등 처리를 하시면 될것 같네요.
json 데이터 파싱은 사용하신 파일들을 첨부해 주시면 테스트 해 보겠습니다.
function initMainPage(){ var documentsDir = null; var showFileAttributes = function(files){ var content = document.getElementById("content").getElementsByTagName("ul")[0], i; for(var i = 0; i < files.length; i++){ if(files[i].isFile){ (function(targetFile){ targetFile.readAsText(function(str) { var markup = '<li onclick=editFile("' + targetFile.name + '");>'; //console.log("The file content " + str); markup+= '<div class="filename">' + str.substring(0,20) + '...</div>'; markup+= '<div class="filedate">' + targetFile.modified + '</div>'; markup+= '<a href=javascript:editFile("' + targetFile.name + '"); class="btn"></a>'; markup+= '</li>'; content.innerHTML+=markup; }, function(e) { //markup+= '<div class="filename">reading file error!</div>'; console.log("readAsText Error: " + e.message + " " + targetFile); }, "UTF-8"); }(files[i])); } } if(i==0){ document.getElementById("content").innerHTML = '<div class="center-align">NO FILE EXISTS</div>'; } }; var errorCallback = function(e){ console.log('Err: ' + e.message); }; deviceapis.filesystem.resolve(function(dir) { try{ documentsDir = dir; dir.listFiles(showFileAttributes,errorCallback); }catch(e){ alert(e.message); } }, function(e) { alert(e.message); }, 'documents', 'rw'); }
제가 하려는게 wgt-package 폴더의 하위디렉토리들을 전부 돌면서 json 파일들을 읽어와서 배열 변수에 모두 담은 후
에
이어서 캔버스로 화면을 그려야 하는데... 하위 디렉토리와 파일들을 읽을때의 콜백 함수가 모두 비동기라서, 위 작업이 모두 끝
나는 시점을 알 수 없더군요.
json 파일을 읽을때마다 화면을 그리는게 아닌, 캐쉬처럼 모두 읽어놓고 화면을 그려야 해서 좀 애매하네요.
(http://dangel.tistory.com/attachment/cfile6.uf@1635383F4E95222927B2BE.
7z)
그리고 제가 사용한 json 파일중 일부입니다. 이미 모바일웹 기반으로는 잘 사용하고 있던거라 파일 자체에는 문제가 없을거라봅니
다.
안드로이드 sdk 의 에뮬에서도 문제가 없는데, 갤탭에서만 오류가 생기는게 참 이상하네요 oTL
감사합니다.
저도 그런 방법에 대해 생각해보고 그렇게도 해봤었는데, 문제는 listFiles 로 디렉토리를 읽고 for문을 돌면서
그중에 하위 디렉토리가 있으면 또 그 하위 디렉토리를 listFiles 로 읽어서 for문을 돌아야하는데
이 listFiles 의 콜백함수 역시 비동기라 하위 디렉토리를 읽어오는 부분도 끝을 알기가 애매하더군요.
뭔가 다른방식으로 처리하거나, 디렉토리의 파일 리스트를 넘겨받아서 그 리스트에 따라 파일을 읽어오게 하거나 해야 할듯 하네요.
감사드립니다~
그러고보니 이건 사이드 문제였고 본문제는 디바이스에서의 json 파싱 오류인데, 주말에 다른 기기좀 빌려와서 테스트해봐야겠네요
oTL
function fileReadAsText(fileName, testType){ var resolveSuccessCallback = function(objFile){ objFile.readAsText( function(str){ try{ if(testType == 'json'){ console.log(fileName + ' ##########################'); var o = ax.util.decodeJSON(str); for(var i in o){ console.log('json ' + i + ' ' + o[i].toString()); } } }catch(e){ console.log(e.message); } }, function(e){ console.log('readAsText err: ' + e.message); }, "UTF-8" ); }; deviceapis.filesystem.resolve( resolveSuccessCallback, function(e){ console.log('resolve err: ' + e.message) }, fileName, 'r' ); } function test(){ fileReadAsText('wgt-package/json/PUMP.shape','json'); fileReadAsText('wgt-package/json/Fan_Centrif_Gray_CW_Right_Dyn.shape','json'); fileReadAsText('wgt-package/json/Shape_PMP_FAN_R.shape','json'); }
말씀해주신 메소드로도 해봤었는데 에러가 나서 이것도 안되는줄 알고 있었는데 존슨님 답변보고 다시 살펴보니
다른곳에 jquery parseJSON 명령이 쓰이고 있어서 계속 에러가 발생했었네요 싸그리 찾아서 바꿔주니 잘되네요 감사합니
다
jquery parseJSON 으로는 에뮬에선 잘되는데 기기에선 에러가 나는군요
별거 아닌걸로 저처럼 삽질 하시는 분이 없길 바라며 ㅠㅠ