花很长时间在设备中显示epub文件

时间:2012-04-25 09:44:11

标签: android epub

我们正在通过我们的应用程序在屏幕上显示一个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);

}

请帮帮我朋友。

2 个答案:

答案 0 :(得分: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用于耗时的操作。

答案 1 :(得分:2)

ePub本质上只不过是一个包含大量HTML文件的zip文件。通常,本书的每章/部分都会有一个文件(资源)。

你现在正在做的是循环阅读书脊,加载所有资源,一次最多可以在屏幕上显示1个。

我建议只加载你想要显示的资源,这样可以大大加快加载时间。