Parser RSS / Atom com a lib Rome no Android

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog. Você receberá um email de confirmação. Somente depois de confirma-lo é que poderei lhe enviar os conteúdos exclusivos.

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
(2377) (19)
Go-ahead
"Esse tem sido um dos meus mantras: foco e simplicidade. Simples pode ser mais difícil do que o complexo. Você tem que trabalhar duro para conseguir o seu pensamento limpo para torná-lo simples. Mas vale a pena no final, porque uma vez que você chegue lá, você pode mover montanhas."
Steve Jobs
Kotlin Android
Capa do livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia
TítuloDesenvolvedor Kotlin Android - Bibliotecas para o dia a dia
CategoriasAndroid, Kotlin
AutorVinícius Thiengo
Edição
Capítulos19
Páginas1035
Acessar Livro
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas186
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas936
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Capítulos46
Páginas599
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
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.

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
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