1

我们正在通过我们的应用程序在屏幕上显示一个 epub 文件。该文件保存在 SDCard 中,我们使用以下逻辑从 SDCard 获取文件数据并显示在 Screen 中。但是在屏幕上加载内容需要很长时间。我的代码有问题吗?请帮助我的朋友。

 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 块。第三,在循环外定义局部变量。关于所有这些,我会以这种方式重写您的代码:

    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 时。

我建议只加载您要显示的资源,这应该会大大加快加载时间。

于 2012-05-08T09:01:47.080 回答