空白屏幕,只弹出"无响应"对话。

时间:2011-12-09 07:03:04

标签: android epub

我无法弄清楚为什么我被困在这一点虽然我的编码没有错误。我的问题实际上是,它不会打印出我的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");

        }
    }

介意在这一点上帮助我吗?

3 个答案:

答案 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().。一旦用户界面向用户显示,将会读取数据