我无法弄清楚为什么我被困在这一点虽然我的编码没有错误。我的问题实际上是,它不会打印出我的epub,也只是挂在那里,直到没有响应的对话框出现。
我的代码如下:
package com.epub;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.domain.Resource;
import nl.siegmann.epublib.domain.Spine;
import nl.siegmann.epublib.domain.SpineReference;
import nl.siegmann.epublib.epub.EpubReader;
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.widget.TextView;
public class EpubReaderActivity extends Activity {
WebView webView;
Book book;
TextView tv;
String line;
String linez;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = new TextView(this);
webView = (WebView)findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
AssetManager am = getAssets();
try {
InputStream epubInputStream = am.open("testbook.epub");
book = (new EpubReader()).readEpub(epubInputStream);
} catch (IOException e) {
Log.e("epublib", e.getMessage());
}
Spine spine = book.getSpine();
List<SpineReference> spineList = spine.getSpineReferences() ;
int count = spineList.size();
tv.setText(Integer.toString(count));
StringBuilder string = new StringBuilder();
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 {
while ((line = reader.readLine()) != null) {
linez = string.append(line + "\n").toString();
}
} catch (IOException e) {e.printStackTrace();}
//do something with stream
} catch (IOException e) {
e.printStackTrace();
}
}
webView.loadData(linez, "text/html", "utf-8");
}
}
介意在这一点上帮助我吗?
答案 0 :(得分:4)
ANR(应用程序无响应)通常在您执行繁重工作时发生。在Android中,如果操作系统在大约5秒内无法执行一个代码行,则会弹出ANR对话框。从您的代码中,您似乎正在从资产文件夹中读取和解析.epub文件。我不熟悉epub文件,但我怀疑这是一项阻碍你的应用程序的繁重任务。
如何启动线程或AsyncTask来读取文件,以免主线程被阻塞?
答案 1 :(得分:0)
在线程内部使用此代码,因为这需要时间来编写数据并加载Web视图 线程是执行的不同部分,如果yor文件很大,则必须等待几秒 您还可以设置进度对话框以显示webview的加载
new Thread(){
public void run() {
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 {
while ((line = reader.readLine()) != null) {
linez = string.append(line + "\n").toString();
}
} catch (IOException e) {e.printStackTrace();}
//do something with stream
} catch (IOException e) {
e.printStackTrace();
}
}
};
}.start();
答案 2 :(得分:-1)
更多您的文件阅读代码格式为onCreaate()
至onResume().
。一旦用户界面向用户显示,将会读取数据