第4回 C#で自作Android アプリを作ろう:RSSを取得してリスト表示

技術顧問の増田です。今回はもう少し本格的な Android アプリの制作ということで、RSS を扱います。ニュースや新着情報を取得するために一世風靡した RSS ですが、最近は下火ですよね…というか、誰が使っているのかわかりませんが、まあ、RSS の取得です。

RSSで何を取得するのか?

今回の目的は、RSS を取得すること自体ではなくて、

– インターネットに接続してデータを取ってくる
– 取ってきたデータをリストで表示する

ところになります。この手の応用は広くて、Web APIでデータを取得したり、Twiter のような既存の Web API を使ったりできるようになります。ちなみに、Web API のやり方は次回に解説します。

サンプルコードは、http://github.com/moonmile/sg-xamarin-sample にある sgCheckRss です。適宜ダウンロードして確認してみてください。

いきなり Android でやらない

さて、RSS の取得ですが、プログラム的には HttpClient と XDocument を使います。HttpClient は、HTTP プロトコルでデータを取ってこれるクラスで、ブラウザで URL を指定するように、このクラスを使うと指定した URL からデータを取ってくることができます。ブラウザだとあれこれと画像データとかを持って来るのですが、RSS のように XML 形式のデータだけ取ってくると転送量が減って、非常に高速にデータを取得できます。いちいち、ブラウザで最新情報をチェックするよりも、RSS で最新情報だけを記述した XML をダウンロードするほうが、Web サーバーの負担が減ります。インターネットでの転送量も減るし、社内からアクセスしたときのデータ量も減ります。まあ、そういう目的で RSS がある/あった訳ですが、人的にはどれだけ使われているかわかりません。ただし、マシン間の転送とか、自動収集をするときにはよいでしょう。

で、RSS で取得したデータは XML 形式なので、これを分解します。XML 形式のデータを分解するには、.NET Framework の System.Xml.Linq.XDocument を使うのが便利です。

というわけで、HttpClient と XDocument の2つの実験を始めるわけですが、これをいきなり Android アプリでやろうとしてはダメです。いや、手慣れていて一発で動くようなパターンであればそれでもいいんですが、いったんコンソールアプリで実験コードを組んだほうが良いでしょう。テスト的に、仮のコードを組むというのは重要で、

– コーディング → 実験 のサイクルが素早くなる
– 自然とライブラリ化できる

の2点で有利です。Hyper-V 上で Android が動くとは言え、Visual Studio でビルドして実行、というサイクルはコンソールアプリよりもかなり遅くなります。ならば、コアな部分だけコンソールアプリを使って実験してみましょう。

コンソールアプリで実験

いきなりですが、ざっと書いたのが以下なコードです。これ自体は、一気に書いたのではなくて、一度 XmlSerializer を使ってデシリアライズを試したのですが、うまくいかないので手作業で XDocument を使っています。まあ、これぐらいの XML 形式のデータであれば手作業でやってもあまり変わりません。

  1. Microsoft の RSS を実験用に使わせて貰います。ええ、何処かの図書館にアクセスすると訴えられてしまうので、実験用の RSS は慎重に選びましょう。
  2. コンソールなアプリでは static な Main メソッドでは async が使えないので、タスクだけ取得します。
  3. タスク待ちをする定番処理ですね。
  4. 結果を XML 形式で受け取ります。失敗を考えるのは面倒なので、成功したものとして突き進みます。所詮、実験用のツールですから。
  5. 取得した XML 形式のデータをコンソールに表示して確認します。
  6. XML 形式のデータを内部で XDocument を使って分解します。これは、後で再利用しやすいように、Rss.cs ファイルに分離させています。
  7. HTTP プロトコルで指定した URL を呼び出すのは、HttpClient#GetStringAsync メソッドを使えばokです。

次は、独自に作った RSS クラスです。

  1. StringReaderで文字列ストリームにして、XDocument.Load で XML を分解します。Stream を使って XDocument オブジェクトにするのは、定番の処理なので覚えてしまってください。
  2. 本来は、XmlSerializer を使って一気に XML 形式から C# のクラスにデシリアライズできればよいのですが、残念ながら RSS の仕様上できません。でも、作ろうとした名残の練習用に #if false で残しておきます。この手の情報は後で意外と役に立ちます。
  3. 分解したルート要素から、最初の channel を取り出します。その後は、子要素が続く item 要素を追加していきます。このあたりの構造がもとの RSS の XML 構造と C# のクラス構造と食い違っていますが、まあ、これでいいです。使いやすいように変換してしまいます。
  4. 取り出すときのルートになる channel プロパティを定義しておきます。小文字になっているのは、リフレクションを使って自動で取り出したいと思った名残ですね。XML 形式の RSS と名前を統一するにもよいので、ここは小文字のままいきます。
  5. 作成したクラスは、RSSChannel と RSSItem になります。RSS に完全に準拠する必要はありません。所詮、社内ツールなのですから。プロパティ名や子要素も読み取りやすい形式にしてしまいましょう。
  6. こっちは RSSItem の定義。
  7. RSSItem#ToString をオーバーライドしておくと、リスト表示するときに便利です。ここでは、タイトル(title)を表示させています。

これを実行すると、以下のようになります。

20161019_01

特にエラーが出てなけば実験は成功です。会社などからアクセスしてプロキシサーバを通す場合は、適宜 HttpClient クラスのオプションを設定します。通常は、Internet Explorer の設定が引き継がれるので、ブラウザで接続できていれば大丈夫なはずです。

Android 画面を作る

20161021_02

画面構成は簡単で、更新用のボタン(Button)とリスト表示(ListView)があるだけです。ListViewコントロールは、データを表示するための定番のコントロールです。

デザイナでの表示

20161021_03

axmlの記述

ListViewの項目をタップしたときに確認できるように、TextView も貼り付けておきます。

Android からの呼び出し

既に RSS を使ってデータを取り出すクラスはできているので、これをそのまま Android のプロジェクトにコピーします。
おおまかなところは、時計アプリと同じですね。ボタンをタップして ListView に登録するところが Android なのでちょっと見慣れないと思います。

解説をしましょう。

  1. Button や ListView コントロールをフィールドとして保持しておきます。
  2. FindViewById メソッドで読み出し。
  3. ボタンクリックのイベントを登録します。
  4. 取得した RSS を保持する変数です。
  5. RSS を取得する部分は、コンソールアプリで実験したときと同じものです。
  6. ListView のへ用事ですが、ArrayAdapter クラスを使って登録します。リストになっている rss.channel.Items を登録します。表示するときのデザインは、Android.Resource.Layout.SimpleListItem1 で指定します。
  7. 作成した ArrayAdapter オブジェクトを ListView コントロールの Adapter プロパティに設定します。ここは定番の処理です。
  8. リストをタップしたときのイベントを登録します。
  9. リストをタップしたときに、RSS のリンクの情報を表示させています。

ListView にアイテムを表示する手順は、6,7 になります。ここでは、既存のデザイン(1行だけ表示するもの)を使っていますが、カスタムデザインを作ることも可能です。これは、次回以降で解説をしましょう。

以下に、詳しい情報があります。

Part 3 – Customizing a ListView’s Appearance – Xamarin
https://developer.xamarin.com/guides/android/user_interface/working_with_listviews_and_adapters/part_3_-_customizing_a_listview’s_appearance/

エミュレータで実行する

Hyper-V のエミュレータで実行した結果が次のようになります。

20161021_04

タイトルだけのリストですが、RSS の情報が取れていることがわかります。項目をタップしたときに URL でブラウザを呼び出すると、少し実用的になるでしょう。

まとめ

今更、RSS という訳でもないですが、これでインターネットを通して WEB サーバーから情報が取れるようになりました。RSS の中身は単なる XML 形式のデータなので適当に分解してやれば、ListView などに表示することは簡単です。

次回は、Web API を利用してデータを取ってきます。オープンデータとして公開されている Web API を使ってデータを取得、Android に表示をするところまで作っていきましょう。

駅データ 無料ダウンロード 『駅データ.jp』
http://www.ekidata.jp/

 

を使っていきます。では、お楽しみに。

増田増田 ( 技術顧問 )@moonmile, Microsoft MVP
システムガーディアン技術顧問
趣味はセミアコでブルースを弾くことと農園でラズベリーを育てることとF#でプログラミングすること。仕事は、ええ、びしびしとプログラミング技術を鍛えることと、ばしばしとC#でプログラムコードを書くことです。

この記事を書いた人:


この記事に関してのお問い合わせ
御連絡・ご返信は原則2営業日以内を予定しております。
お急ぎの場合は、お手数ですが下記電話でもご対応をしております。

システムガーディアン株式会社
受付時間:平日9:00~18:00
受付担当:坪郷(つぼごう)・加藤
電話:03-6758-9166