2012-04-25 3 views
1

우리 응용 프로그램을 통해 화면에 epub 파일을 표시하고 있습니다. 파일은 SDCard에 저장되고 SDCard에서 파일 데이터를 가져 와서 Screen에 표시 할 때 사용하는 다음 논리가 사용됩니다. 그러나 화면에 내용을로드하는 데 오랜 시간이 걸립니다. 내 코드에 문제가 있습니까? 친구 좀 도와주세요.장치에 epub 파일을 표시하는 데 오랜 시간이 걸렸습니다.

File rootDir = Environment.getExternalStorageDirectory(); 
    EpubReader epubReader = new EpubReader(); 
    try { 
     book = epubReader.readEpub(new FileInputStream("/sdcard/forbook.epub")); 
     Toast.makeText(getApplicationContext(), "Book : " + book, Toast.LENGTH_LONG).show(); 
    } catch (FileNotFoundException e) { 
     Toast.makeText(getApplicationContext(), "File Not Found" + book, Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "IO Found" + book, Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } 
    Spine spine = book.getSpine(); 
    List<SpineReference> spineList = spine.getSpineReferences() ; 
    int count = spineList.size(); 
    StringBuilder string = new StringBuilder(); 
    String linez = null; 
    for (int i = 0; count > i; i++) { 
     Resource res = spine.getResource(i); 

     try { 
      InputStream is = res.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      try { 
       String line; 
      while ((line = reader.readLine()) != null) { 
        linez = string.append(line + "\n").toString(); 
        //linez=line.toString(); 
       } 

      } catch (IOException e) {e.printStackTrace();} 

      //do something with stream 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
    final String mimeType = "text/html"; 
    final String encoding = "UTF-8"; 
    webView.loadDataWithBaseURL("", linez, mimeType, encoding,null); 

} 

제발 나를 도와주세요.

답변

2

ePub는 본질적으로 많은 HTML 파일이 포함 된 zip 파일 일뿐입니다. 종종 책의 장/절당 하나의 파일 (자원)이 있습니다.

현재 당신이하고있는 일은 한 번에 화면에 최대 1 개를 표시 할 수있을 때 모든 리소스를로드하면서 책의 척추를 반복하는 것입니다.

표시하려는 리소스를로드하는 것이 좋을 것입니다.로드하는 시간을 대폭 단축해야합니다.

+0

누구든지 샘플 epub 리더에 대한 링크를 제공 할 수 있습니까? –

+0

내 자신의 프로젝트를 다시 광고 할 위험이 있습니다. http://github.com/nightwhistler/pageturner - GPL 라이센스가 있음을인지하십시오. – NightWhistler

2

먼저 StringBuilder을 올바르게 사용하지 마십시오. 코드에서 전혀 쓸모가 없습니다. 둘째, 실제로 중첩 된 try-catch 블록이 필요한지 결정하십시오. 셋째, 지역 변수를 루프 외부에 정의하십시오.

StringBuilder string = new StringBuilder(); 
    Resource res; 
    InputStream is; 
    BufferedReader reader; 
    String line; 
    for (int i = 0; count > i; i++) { 
     res = spine.getResource(i); 
     try { 
      is = res.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(is)); 
      while ((line = reader.readLine()) != null) { 
       string.append(line + "\n"); 
      } 

      // do something with stream 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    ... 
    webView.loadDataWithBaseURL("", string.toString(), mimeType, encoding, null); 

그러나, 나는이 대폭 콘텐츠를로드하는 데 필요한 시간을 줄일하지 않을 생각, 그래서 당신이 찾을 Traceview를 사용하는 것이 좋습니다 것 : 나는 당신의 코드를 이런 식으로 다시 것이 모든에 관하여 코드에서 병목 현상이 발생하고 시간이 많이 소요되는 작업에 AsyncTask을 사용하십시오.

관련 문제