Пустой экран и только всплывающее диалоговое окно «Не отвечает». - PullRequest
0 голосов
/ 09 декабря 2011

Я не могу понять, почему я застрял в этой точке, хотя нет ошибки в моем кодировании. Моя проблема на самом деле, он не распечатывает мой 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 ]

4 голосов
/ 09 декабря 2011

ANR (приложение не отвечает) обычно происходит, когда вы выполняете тяжелую работу.В Android, если ОС не может выполнить одну строку кода в течение примерно 5 секунд, появится диалоговое окно ANR.Судя по вашим кодам, вы читаете и анализируете файл .epub из папки вашего ресурса.Я не знаком с файлами epub, но подозреваю, что это тяжелая задача, которая блокирует ваше приложение.

Как насчет запуска потока или AsyncTask для чтения файла, чтобы основной поток не могбыть заблокирован?

0 голосов
/ 09 декабря 2011

Pu этот код внутри потока, так как это требует времени для записи данных и загрузки веб-представления Поток - это другая часть выполнения, и вам придется ждать несколько sconds, если ваш файл большой Вы также можете поместить диалоговое окно прогресса, чтобы показать загрузку веб-просмотра

           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();
0 голосов
/ 09 декабря 2011

Дополнительная форма кода чтения вашего файла onCreaate() до onResume(). Поскольку данные будут считаны, как только пользовательский интерфейс покажет пользователю

...