Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,003
Завершенные тесты: 2
#1

Предотвратить выключение программы при загрузке и парсинге сайтов средствами Jsoup

05.10.2016, 19:11. Просмотров 834. Ответов 6
Метки нет (Все метки)

Есть вот такой код для загрузки и парсинга сайтов. Если сюда скормить левый адрес для загрузки или при обработки Jsoup будет непойми что, естественно, выползает ошибка и приложение крашится.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Loader extends AsyncTask<String, Void, String>{
 
        private Resource resource;
        private Document doc;
        @Override
        protected String doInBackground(String... params) {
            Log.w("parse", "" + params[0]);
            //System.out.print(params);
            resource = DatabaseSingleton.getInstance().getDataBase().getResourceById(Integer.parseInt(params[0]));
            doc = null;
            try {
                Log.w("parse", "" + resource.get_link());
                doc = Jsoup.connect(resource.get_link()).get();
                String title = doc.title();
                Log.w("parse", title);
            } catch (IOException e) {
                //e.printStackTrace();
                doc = null;
            }
            return null;
        }
 
        @Override
        protected void onPostExecute(String success) {
            super.onPostExecute(success);
            if (success.equals("true")) {
                Log.w("parse", "complete good");
            }else {
                Log.w("parse", "complete bed");
                Toast.makeText(adapter.getContext(),"Error loading", Toast.LENGTH_SHORT).show();
            }
            Log.w("parse", "complete");
            hash.put(resource.get_id(), false);
 
            Elements element = doc.select(resource.get_html());
            String string = element.html();
            String hash = DatabaseSingleton.md5(string);
 
            DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(Resource.NAME_DATE_CHANGE, System.currentTimeMillis());
            if(hash == DatabaseSingleton.getInstance().getDataBase().getResourceById(resource.get_id()).get_hash()){
                Log.w("parse", "hash not changed");
                contentValues.put(Resource.NAME_STATUS, Resource.STATUS_DEFAULT);
            }else {
                if(db.getResourceById(resource.get_id()).getStatus() != Resource.STATUS_DEFAULT){
                    contentValues.put(Resource.NAME_STATUS, Resource.STATUS_UNVIEWED);
                }
                contentValues.put(Resource.NAME_HASH, hash);
                Log.w("parse", "new change");
            }
            db.updateData(resource, contentValues);
            adapter.updateAllView();
            DatabaseSingleton.getInstance().getActivity().onListUpdate(true);
 
        }
 
    }
Как сделать так, что бы приложение не прекращала работу, а только ограничивалось сообщением об ошибке (Toast.makeText вполне подойдет)?
Заранее спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2016, 19:11
Ответы с готовыми решениями:

Реализовать многопоточность при парсинге сайтов
Привет парни!) есть код ,но вообще не отстреливаю как реализовать...

Чем вы пользуетесь при парсинге сложных сайтов?
Собственно САБЖ.

Предотвратить открывание всех пунктов меню при загрузке
есть такое меню: &lt;div id=&quot;menu&quot;&gt; &lt;ul id=&quot;accordion&quot;&gt; &lt;li id=&quot;m1&quot;&gt;...

Писк при выключение, загрузке ОС
Ситуация такова: 1. при выключение Windows 8.1, компьютер пищит. 2. при...

Выключение ПК при загрузке Windows
Доброго дня суток, Буду очень благодарен если кто то сможет помочь какими либо...

6
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
05.10.2016, 19:23 #2
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
   @Override
    protected void onPostExecute(String success) {
        super.onPostExecute(success);
        if (success.equals("true")) {
            Log.w("parse", "complete good");
            Log.w("parse", "complete");
            hash.put(resource.get_id(), false);
 
            Elements element = doc.select(resource.get_html());
            String string = element.html();
            String hash = DatabaseSingleton.md5(string);
 
            DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(Resource.NAME_DATE_CHANGE, System.currentTimeMillis());
            if(hash == DatabaseSingleton.getInstance().getDataBase().getResourceById(resource.get_id()).get_hash()){
                Log.w("parse", "hash not changed");
                contentValues.put(Resource.NAME_STATUS, Resource.STATUS_DEFAULT);
            }else {
                if(db.getResourceById(resource.get_id()).getStatus() != Resource.STATUS_DEFAULT){
                    contentValues.put(Resource.NAME_STATUS, Resource.STATUS_UNVIEWED);
                }
                contentValues.put(Resource.NAME_HASH, hash);
                Log.w("parse", "new change");
            }
            db.updateData(resource, contentValues);
            adapter.updateAllView();
            DatabaseSingleton.getInstance().getActivity().onListUpdate(true);
        }else {
            Log.w("parse", "complete bed");
            Toast.makeText(adapter.getContext(),"Error loading", Toast.LENGTH_SHORT).show();
        }
 
    }
не?
1
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,003
Завершенные тесты: 2
05.10.2016, 19:36  [ТС] #3
Паблито, на данный момент ошибка в блоке try-catch в строке
Java
1
doc = Jsoup.connect(resource.get_link()).get();
10-05 19:34:51.820 25544-26197/com.tanatix.checkinternetresourceschanges E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.tanatix.checkinternetresourceschanges, PID: 25544
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.IllegalArgumentException: Malformed URL: link
at org.jsoup.helper.HttpConnection.url(HttpConnection.java:76)
at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:36)
at org.jsoup.Jsoup.connect(Jsoup.java:73)
at com.tanatix.checkinternetresourceschanges.UpdateController$Loader.doInBackground(UpdateController.java:70)
at com.tanatix.checkinternetresourceschanges.UpdateController$Loader.doInBackground(UpdateController.java:58)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)*
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)*
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)*
at java.lang.Thread.run(Thread.java:841)*
Caused by: java.net.MalformedURLException: Protocol not found: link
at java.net.URL.<init>(URL.java:176)
at java.net.URL.<init>(URL.java:125)
at org.jsoup.helper.HttpConnection.url(HttpConnection.java:74)
at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:36)*
at org.jsoup.Jsoup.connect(Jsoup.java:73)*
at com.tanatix.checkinternetresourceschanges.UpdateController$Loader.doInBackground(UpdateController.java:70)*
at com.tanatix.checkinternetresourceschanges.UpdateController$Loader.doInBackground(UpdateController.java:58)*
at android.os.AsyncTask$2.call(AsyncTask.java:288)*
at java.util.concurrent.FutureTask.run(FutureTask.java:237)*
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)*
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)*
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)*
at java.lang.Thread.run(Thread.java:841)*
0
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
05.10.2016, 19:49 #4
а если там ловить исключение?
Java
1
2
3
4
5
            try {
                doc = Jsoup.connect("тут был какой-то код").get();
            } catch (MalformedURLException e) {
                // как-то реагируем и дальше уже не пытаемся обрабатывать ответ от сервера
            }
1
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,003
Завершенные тесты: 2
06.10.2016, 11:37  [ТС] #5
Паблито, так эта строка и так в трай-кэтче. Или заморочка с MalformedURLException?

Добавлено через 15 часов 34 минуты
Паблито, нет, android studio требует именно IOException, иначе выдает ошибку.
0
Pablito
2707 / 2154 / 731
Регистрация: 12.05.2014
Сообщений: 7,516
Завершенные тесты: 1
06.10.2016, 11:54 #6
Лучший ответ Сообщение было отмечено TanaTiX как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                boolean success = false;
                Document doc = null;
                try {
                    try {
                        doc = Jsoup.connect("ht1tp://ya.ru").get();
                        String title = doc.title();
                        success = true;
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // где-то там, дальше делаем return success;
Добавлено через 59 секунд
или даже так
Java
1
2
3
4
5
6
7
8
9
10
                boolean success = false;
                Document doc = null;
                try {
                    doc = Jsoup.connect("ht1tp://ya.ru").get();
                    String title = doc.title();
                    success = true;
                } catch (IOException | IllegalArgumentException e) {
                    e.printStackTrace();
                }
                // где-то там, дальше делаем return success;
1
TanaTiX
Модератор
2796 / 1650 / 168
Регистрация: 19.02.2011
Сообщений: 6,003
Завершенные тесты: 2
06.10.2016, 12:57  [ТС] #7
Паблито, с небольшими правками, но помогло, спасибо.
0
06.10.2016, 12:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2016, 12:57

Выключение и перезагрузка ПК при загрузке игры
С недавнего времени появилась проблема. Комп работает до того момента, пока не...

Выключение звука видео при загрузке .muted
Добрый день. Сайт reka63.ru . По умолчанию при загрузке страницы звук...

Предотвратить выключение компьютера на некоторое время
Направьте меня о Гуру С#. Мне необходимо сделать следующее. Если вдруг...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru