2012-04-25 4 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つのファイル(リソース)が存在します。

あなたが今やっていることは、一度に一度に1つの画面に多くても1を表示することができるときに、すべてのリソースを読み込む、本の背骨をループすることです。

私は表示したいリソースだけを読み込むことをお勧めします。これは、読み込み時間を大幅に短縮するはずです。

+0

誰でも私にサンプルepubリーダーのリンクを教えていただけますか? –

+0

私自身のプロジェクトを再度宣伝する危険性があるので、http://github.com/nightwhistler/pageturnerを見てください - GPLのライセンスがあることに気をつけてください。 – NightWhistler

2

まず、StringBuilderは正しく使用されません。コード内ではまったく役に立たないです。第二に、ネストされたtry-catchブロックが本当に必要かどうかを決定します。第3に、ループ外のローカル変数を定義します。

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を使用します。

関連する問題