1

アプリケーションを介して画面に epub ファイルを表示しています。ファイルは SDCard に保存され、次のロジックを使用して SDCard からファイル データを取得し、画面に表示します。しかし、コンテンツを画面にロードするのに時間がかかります。コードに問題はありますか? 友達を助けてください。

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

}

友達を助けてください。

4

2 に答える 2

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時間のかかる操作に使用することをお勧めします。

于 2012-04-25T11:20:11.217 に答える
2

ePub は、基本的に、多数の HTML ファイルを含む zip ファイルにすぎません。多くの場合、本の章/セクションごとに 1 つのファイル (リソース) があります。

あなたが今行っていることは、本の背表紙をループして、おそらく一度に画面に最大 1 つしか表示できないときに、すべてのリソースをロードすることです。

表示したいリソースのみをロードすることをお勧めします。これにより、ロード時間が劇的に短縮されます。

于 2012-05-08T09:01:47.080 に答える