1. Java / Говнокод #19495

    −34

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    public class MainActivity extends ActionBarActivity {
        String rssResult;
        boolean item = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            rssResult = "";
            TextView rss = (TextView) findViewById(R.id.rss);
            try {
                URL rssUrl = new URL("http://rfs.ru/rss/news.rss");
                SAXParserFactory factory = SAXParserFactory.newInstance();
                SAXParser saxParser = factory.newSAXParser();
                XMLReader xmlReader = saxParser.getXMLReader();
                RSSHandler rssHandler = new RSSHandler();
                xmlReader.setContentHandler(rssHandler);
                InputSource inputSource = new InputSource(rssUrl.openStream());
                xmlReader.parse(inputSource);
                rss.setText(rssResult);
            } catch (IOException e) {rss.setText(e.getMessage());
            } catch (SAXException e) {rss.setText(e.getMessage());
            } catch (ParserConfigurationException e) {rss.setText(e.getMessage());
            }
    
        }
        private class RSSHandler extends DefaultHandler {
    
            public void startElement(String uri, String localName, String qName,
                                     Attributes attrs) throws SAXException {
                if (localName.equals("item"))
                    item = true;
    
                if (!localName.equals("item") && item == true)
                    rssResult = rssResult + localName + ": ";
    
            }
    
            public void endElement(String namespaceURI, String localName,
                                   String qName) throws SAXException {
    
            }
    
            public void characters(char[] ch, int start, int length)
                    throws SAXException {
                String cdata = new String(ch, start, length);
                if (item == true)
                    rssResult = rssResult +(cdata.trim()).replaceAll("\\s+", " ")+"\t";
    
            }
    
        }
    }

    Пытаюсь впихнуть rss'ку в приложение, а оно вылетает сразу после запуска. Ошибка указывает на 18 строку " InputSource inputSource = new InputSource(rssUrl.openStream());". Ошибка java.lang.RuntimeException: Unable to start activity ComponentInfo

    Запостил: lancevrot, 19 Февраля 2016

    Комментарии (21) RSS

    • 12 строка не?
      Ответить
    • нужен еще один catch для RuntimeException
      Ответить
    • У тебя, скорее всего, NetworkInMainThreadException :)

      Не знаю, как там устроены эти ридеры, но скорее всего тупо делают синхронный коннект в том же треде, откуда их позвали. А разрабов андроида 4+ заебали индусы, которые лезут в сеть из главного потока, и жалобы пользователей в духе "андроид говно лагучее", поэтому за сеть в главном треде прогу мгновенно карают экцепшеном...
      Ответить
      • Что есть правильно и богоугодно.

        Я бы еще в лабах насильно заставлял делать трудоемкие вычисления в других потоках, а то когда гуи зависает - очень неприятно
        Ответить
        • Предлагаю делать лабы на JS. Клиент-серверная архитектура, однопоточный код для браузера, однопоточный код для сервера, гуй не виснет, все рады.
          Ответить
          • Виснет же к хуям, если какое-то длинное вычисление запустить...

            Или ты предлагаешь чтобы вис сервер, а клиент асихронно ждал, пока он закончит?
            Ответить
            • > Или ты предлагаешь чтобы вис сервер, а клиент асихронно ждал, пока он закончит расчёт?
              Да, именно так.
              Ответить
              • Но это уже 2 потока, а не 1 :)
                Ответить
                • >> однопоточный код для браузера, однопоточный код для сервера
                  > Но это уже 2 потока, а не 1 :)
                  Два потока, но код-то однопоточный (магия).
                  Ответить
                  • Это не магия, это хуйня какая то.
                    Ответить
                  • Да где ж он однопоточный? Один поток в браузере, второй на сервере.
                    Ответить
                    • Как где? На сервере - однопоточный, на клиенте тоже однопоточный.
                      Весь многопоточный код остался где-то позади в ОС, даже событийная питушня осталась на совести жс-движка.
                      Ответить
                  • Кстати, однопоточный но отзывчивый код можно сделать на прерываниях... Единственный тред считает что-то долгое, а обработчики прерываний делают что-то маленькое и быстрое.
                    Ответить
                    • CPS?

                      Можно, но... в реальности его кто то вообще использует?
                      Ответить
                      • Почему CPS? Просто прерывания.

                        А CPS юзает тот же boost::asio. Там всё на этих коллбеках. Ну и нода.жс же, классика коллбечной лапши.
                        Ответить
                        • >> А CPS юзает тот же boost::asio.

                          Извращенцы... Ну или я туповат
                          Ответить
                      • ppl::task
                        даже в стандарт хотят добавить
                        Ответить
          • Когда await завезете, тогда и посмотрим
            Ответить
      • Зафигачил я значит сервис с помощью RoboSpice, делаю всю эту шнягу в отдельном потоке, а ошибка все равно на той же строке.
        Ответить

    Добавить комментарий