Parser RSS / Atom com a lib Rome no Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /Parser RSS / Atom com a lib Rome no Android

Parser RSS / Atom com a lib Rome no Android

Vinícius Thiengo
(2780) (19)
Go-ahead
"Todas as manhãs, na África uma gazela acorda e sabe que deve se mover mais rápido do que o leão ou não vai sobreviver. Todas as manhãs um leão acorda e sabe que deve se mover mais rápido do que a gazela mais lenta ou ele vai morrer de fome. Não importa se você é o leão ou a gazela, quando o sol nasce, é melhor você estar em movimento."
Maurice Greene
Kotlin Android
Capa do livro Mapas Android de Alta Qualidade - Masterização Android
Cyber Week
TítuloMapas Android de Alta Qualidade - Masterização Android
CategoriasAndroid, Kotlin, Masterização, Especialização
AutorVinícius Thiengo
Edição
Ano2020
Capítulos11
Páginas166
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa! Blz?

Nesse vídeo mostro como realizar a leitura de feeds RSS / Atom no Android utilizando a lib Rome que é bem simples de utilizar e muito eficiente quanto ao conteúdo obtido. Feeds RSS são comuns hoje pela Web, principalmente no meio dos blogs (é, o meu não tem, não utilizo). Os leitores de Feed para Android podem ser sua chave para obter o conteúdo de seu blog e disponibiliza-lo na plataforma mobile sem ter que colocar a mão no código e trabalhar com acesso a bancos de dados por meio de servidores Web, abertura de "n" Threads e afins. Com a lib Rome há ainda a necessidade de se abrir uma outra Thread para baixar o conteúdo, mas nada que implique em várias linhas de código. Claro que se perde muito em personalização e outros quando o máximo que você tem é o conteúdo informado pelo Feed, porém (pelo menos penso assim) somente quando você quiser trabalhar de uma maneira bem customizada é que o leitor RSS pode não ser útil, mas mesmo assim ele continua sendo uma "carta de baixo da manga". Mas enfim, vou evitar mais delongas e deixar você assistir ao vídeo que apesar de ser longo é de implementação bem simples.

O link para download o projeto se encontra logo abaixo no post.

Se você não conhece ainda as entidades ListView, BaseAdapter e runOnUiThread, segue lista de vídeos que já fiz sobre essas:

ListView: Entendendo e Utilizando no Android

Utilizando BaseAdapter Para Personalização Completa da ListView

runOnUiThread, Atalho de Acesso a Thread Principal no Android

Segue link da lib Rome:

Página da lib Rome no repositório do Google

Vlw.

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

API do YouTube na APP Android, IniciandoAPI do YouTube na APP Android, IniciandoAndroid
Upload de Vídeo e YouTubeIntents com YouTube API no AndroidUpload de Vídeo e YouTubeIntents com YouTube API no AndroidAndroid
Parser JSON no Android, Entendendo e UtilizandoParser JSON no Android, Entendendo e UtilizandoAndroid
Navigator Drawer na ActionBar Android, Entendendo e UtilizandoNavigator Drawer na ActionBar Android, Entendendo e UtilizandoAndroid

Compartilhar

Comentários Facebook

Comentários Blog (19)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Bruno Albuquerque (1) (0)
13/04/2015
Oi Vinícios, estou desenvolvendo uma aplicação que utiliza o RSS a api google maps v2. Tanto o RSS quanto o mapa eu desenvolvi com base nos exemplos  que você mostra aqui no blog. É o seguinte, a minha aplicação tem uma tela principal que estende SherlockFragmentActivity, nela eu tenho uma lista com dois ícones que abrem cada um uma janela que estende de SherlockFragmentActivity. E uma janela existe o mapa e na outra o RSS, sempre que eu abro primeiro o RSS e depois o mapa tudo acontece normalmente, mas quando abro primeiro o mapa e depois o RSS a lista de notícias do RSS não aparece. Já procurei muito e não encontrei solução, espero que você possa me ajudar com isto. Segue o warning que aparece no logcat:

04-13 14:53:58.832  29104-29299/com.brunoleonardo.ibsaleluz W/dalvikvm? Exception Ljava/lang/NullPointerException; thrown while initializing Lcom/google/code/rome/android/repackaged/com/sun/syndication/feed/synd/SyndFeedImpl;
04-13 14:53:58.832  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? java.lang.ExceptionInInitializerError
04-13 14:53:58.832  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.io.SyndFeedInput.build(SyndFeedInput.java:123)
04-13 14:53:58.832  29104-29299/com.brunoleonardo.ibsaleluz W/ActivityThread? ClassLoader.getResourceAsStream: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.brunoleonardo.ibsaleluz.activitys.noticia.Noticias$1.run(Noticias.java:63)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? Caused by: java.lang.NullPointerException: in == null
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at java.util.Properties.load(Properties.java:246)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.io.impl.PropertiesLoader.<init>(PropertiesLoader.java:74)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.io.impl.PropertiesLoader.getPropertiesLoader(PropertiesLoader.java:46)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.io.impl.PluginManager.<init>(PluginManager.java:54)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.io.impl.PluginManager.<init>(PluginManager.java:46)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.feed.synd.impl.Converters.<init>(Converters.java:40)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? at com.google.code.rome.android.repackaged.com.sun.syndication.feed.synd.SyndFeedImpl.<clinit>(SyndFeedImpl.java:59)
04-13 14:53:58.836  29104-29299/com.brunoleonardo.ibsaleluz W/System.err? ... 2 more

Obs: Fazendo teste descobri que é alguma coisa ligada a este componente do meu layout do mapa:

<fragment
        android:id="@+id/fragmentMap"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
Responder
Vinícius Thiengo (1) (0)
13/04/2015
Fala Bruno, blz?
Faça o seguinte, carregue o mapa do Google via Java API ao invés de utilizar a tag de fragment (que não permitirá o recarregamento). Nos vídeos sobre o fragment eu mostro como carregar via API ao invés de via xml. Faz esse teste e ve se funciona. Caso não volte ae. Abraço

Obs. : é Vinícius
Responder
Bruno Albuquerque (1) (0)
14/04/2015
Opa Vinícius, obrigado pela atenção. Fiz como você falou e continua dando o mesmo erro, não sei se é pelo fato de eu está acessando a thread principal nas duas SherlockFragmentActivity através do runOnUiThread, ou se isso não tem nada a ver. Vou continuar procurando uma solução, e se você tiver alguma ideia me diz alguma coisa. Obrigado, abraço.
Responder
Vinícius Thiengo (0) (0)
15/04/2015
Bruno, print as noticias do feed no LogCat somente para saber se elas estão sendo entregues em sua APP e por algum motivo elas não aparecem na tela. Precisamos saber se ao menos as news estão sendo entregues. Abraço
Responder
Bruno Albuquerque (1) (0)
15/04/2015
E ai Vinícius, mais uma vez obrigado. Fiz como você falou e dei um print, mas na verdade o feed não chega nem a retornar nada. Na verdade, se eu entrar na aplicação e for direto nas notícias, a aplicação funciona corretamente e exibe as notícias. O problema é se eu abrir o mapa primeiro e depois sair do mapa e for nas notícias, ai sim acontece o problema. Segue o código da função que está sendo chamada para processar as notícias e a linha do erro:


private void readFeed(final String urlFeed){
        new Thread(){
            public void run(){
                java.net.URL url;
                try {
                    url = new URL(urlFeed);
                    SyndFeedInput input = new SyndFeedInput();
                    XmlReader xr = new XmlReader(url);

                    SyndFeed feed = input.build(xr);  // ESTA É A LINHA QUE ESTÁ DANDO ERRO

                    List entradas = feed.getEntries();

                    Iterator it = entradas.iterator();

                    while(it.hasNext()){
                        SyndEntry aux = (SyndEntry) it.next();
                        listSynd.add(aux);
                    }

                    runOnUiThread(new Runnable(){
                        public void run(){
                            adapter.notifyDataSetChanged();
                        }
                    });

                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (FeedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExceptionInInitializerError e){
                    e.printStackTrace();
                } catch (NoClassDefFoundError e){
                    e.printStackTrace();
                }
            }
        }.start();
    }
Responder
Vinícius Thiengo (0) (0)
15/04/2015
Bruno, verifique se a variável urlFeed está tendo um valor válido quando vc realiza o procedimento que retorna que não apresenta as news. Verifique via LogCat mesmo. Abraço
Responder
Bruno Albuquerque (1) (0)
15/04/2015
Fala Vinícius, fiz o que você disse e verifiquei que a variável está sim com um valor válido. Acho que o problema tem a ver com isso:

ClassLoader.getResourceAsStream: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());

Não sei se por eu está acessando a thread principal nas duas atividades é que isto está ocorrendo, ainda estou tentando encontrar alguma forma de resolver.
Responder
Bruno Albuquerque (1) (0)
15/04/2015
Oi Vinícius, consegui resolver o problema foi só usar setContextClassLoader(getClass().getClassLoader())  na thread antes de chamar o método start. Muito obrigado pela ajuda, seu blog é show.
Responder
Vinícius Thiengo (0) (0)
16/04/2015
Show de bola Bruno. Abraço
Responder
Francisco Neto (0) (0)
10/06/2014
Olá Vinícius, fiz o código todo na mão conforme o vídeo, mas não carrega nada quando clico no botão, então fiz o download do código, mas mesmo assim continua não aparece as notícias quando clico no botão, não está dando nem uma mensagem de erro.
Responder
Vinícius Thiengo (0) (0)
10/06/2014
Fala Francisco, blz?
Qual a url que está utilizando para pegar o feed? A mesma do vídeo? Já tentou outro provedor de Feeds? De repente é o provedor que está sem conteúdo ou não prove mais Feeds. abraço
Responder
Francisco Neto (1) (0)
11/06/2014
Resolvido identifiquei que era a url  pode está sem conteúdo , então troquei por outra e funcionou. Obrigado.
Responder
Ferreira (0) (0)
08/05/2014
Tentei executar o exemplo em um aplicação que estou desenvolvendo e estou com o seguinte erro:

[2014-05-08 17:25:18 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/google/code/rome/android/repackaged/com/sun/syndication/feed/CopyFrom;
[2014-05-08 17:25:18 - SindicatoSTIAM] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/google/code/rome/android/repackaged/com/sun/syndication/feed/CopyFrom;

Poderia ajudar
Responder
Vinícius Thiengo (0) (0)
08/05/2014
Fala Ferreira, blz?
Me diga, vc fez o código na mão ou pegou o projeto para download que está no blog? Vc está utilizando o Eclipse ou o Android Studio? Preciso saber disso, pois aparentemente o erro está na estrutura do projeto, mas não tenho certeza. Abraço
Responder
Ferreira (0) (0)
09/05/2014
Bom dia Vinicius, eu fiz o código na mão. e estou utilizando o eclipse.
Pois desenvolvendo uma aplicativo com um icone para ler rss e quando foi inserir o codigo explicado deu este erro. Quando ao download do projeto esta funcionando corretamente, tentei tbm jogar o projeto  desenvolvimento dentro do meu e acontece o mesmo erro ... Se puder ajudar agradeço ...
Responder
Ferreira (0) (0)
09/05/2014
Bom dia novamente o erro, passado conseguir resolver, era problema com os arquivos .jar, já deu certo agora estou com o seguinte erro ..

NoticiasActivity.readFeed(NoticiasActivity.java:62)

NoticiasActivity.access$0(NoticiasActivity.java:61)

NoticiasActivity$1.onClick(NoticiasActivity.java:52)

aguardo retorno se puder ajudar
Responder
Vinícius Thiengo (0) (0)
09/05/2014
Fala Ferreira, então vc esqueceu de colocar o erro aqui! (isso ai ainda não é a mensagem de erro). Mas verifique se vc vinculou o method correto ao evento de click do botão que ativa o RSS e se está utilizando uma outra Thread quando vai chamar a conexão com url feed que fornecerá o conteúdo desejado. abraço
Responder
Ferreira (0) (0)
09/05/2014
Então o evento do click, esta feito igual ao mostrado no video, fiz até o download do seu projeto e copie igual, mas mesmo assim continuo com o mesmo problema no click..
Responder
Vinícius Thiengo (0) (0)
09/05/2014
Ok, Cole a mensagem de erro completa aqui, pois não estou conseguindo imaginar qual deve ser o erro. Abraço
Responder