【Kotlin】RetrofitとSimple XML ConverterでRSSをパースする

投稿日:2017年12月29日 更新日:

Retrofitを使ってRSSを取得して、取得したRSSをパースする、というのをやりたかったのでやってみました。RSSのパースにはSimple XML Converterというコンバータを使います。

今回パースするRSSは、はてなブックマークのRSSです。

feeds.feedburner.com/hatena/b/hotentry

ライブラリの導入

まずはプロジェクトにライブラリを導入します。Retrofit2、Simple XML Converter、あとRxKotlinを使うので、build.gradleに追加してSyncします。

dependencies {
    //retrofit
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0"

    //SimpleXmlConverter
    compile 'com.squareup.retrofit2:converter-simplexml:2.3.0'

    //RxKotlin
    compile 'io.reactivex.rxjava2:rxkotlin:2.0.0'
}

Retrofit関係の設定

まずはRetrofit用のインターフェースを定義してあげます。Observableを返すようにしてあげると、何かと楽です。

import io.reactivex.Observable
import retrofit2.http.GET

/**
 * Retrofit用のクライアント
 */

interface HatenaClient {
    @GET("/hatena/b/hotentry")
    fun getHotEntry() : Observable
}

フィードのPOJOクラスについては、Simple XML Converterのアノテーションを使ってやっていくわけですが、これが難しかったです。今回は、以下の記事を参考にさせていただきました。この記事がなければ、完成は3日は遅れていたでしょう。

Retrofit2.0でホッテントリのRSSをパースしてみる - techium

準備ができたので、早速RSSの内容を表示してみたいと思います。マニフェストファイルでインターネットのパーミッションを取得しておくのを忘れないでくださいね。

val retrofit = Retrofit.Builder()
		.baseUrl("http://feeds.feedburner.com")
		.addConverterFactory(SimpleXmlConverterFactory.create())
		.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
		.build()

val result = retrofit.create(HatenaClient::class.java).getHotEntry()

result.subscribeOn(Schedulers.newThread())
		.observeOn(AndroidSchedulers.mainThread())
		.subscribe({ response ->
			//成功した時の処理
			//今回はここでRecyclerViewに結果を表示する
		}, { error ->
			//失敗した時の処理
			error.printStackTrace()
		})

Retrofitのインスタンスを生成する時に、addConverterFactoryでSimple XML Converterを、addCallAdapterFactoryでRxJavaのアダプタを渡しています。あとはRetrofitとRxKotlinが上手くやってくれます。あとはRecyclerViewなりListViewなりをよしなに設定してあげれば、こんな感じで表示できます。簡単にできましたね!

retrofit + Simple xml converter

リリースビルドで生じた問題

Simple XML Converterを使ったプロジェクトでリリースビルドを作る時に若干の問題が生じたので、解決策をメモしておきます。

transformClassesWithDexForDebug

build.gradleのcompile文を以下のように修正することで対応。

compile ('com.squareup.retrofit2:converter-simplexml:2.3.0') {
	exclude module: 'stax-api'
	exclude module: 'stax'
	exclude module: 'xpp3'
}

参考:retrofit 2.0 xml simplexml converter issue while having retrolambda in gradle file - Stack Overflow

app:transformClassesAndResourcesWithProguardForRelease

proguard-rules.proに以下を追記することで対応。

-ignorewarnings

-keep class * {
    public private *;
}

参考:android - Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease - Stack Overflow

茨城県つくば市在住のAndroidアプリエンジニアです。

-Android

Copyright© Androidアプリ開発@つくば , 2018 AllRights Reserved Powered by AFFINGER4.