我们正在通过我们的应用程序在屏幕上显示一个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);
}
请帮帮我朋友。
答案 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个。
我建议只加载你想要显示的资源,这样可以大大加快加载时间。