FeedImageViewerにRephotoさんを追加

Androidに美人さん改め複数サイトに対応し無事にFeedImageViewerと呼ぶことにしたプログラムですが、Rephotoさんに対応しました。


RephotoさんはきちんとRSSを用意してくださっているのですが、今回は訳有ってRSSではなくシンプルモードのHTMLを直接読んで解析しています。これはRephotoさんのRSSがDescriptionタグにHTMLを持つタイプのため、どちらにしてもHTML解析になってしまうためです。


しかしそのことを考えるともはやFeedImageViewerとも呼べるようなアプリではなくなってしまいました。
RSSはやはりXSLTによりブラウザで見る、FirefoxプラグインなどHTMLの使用できる環境で見る、または外部ブラウザを起動する環境で見るというものなのかもしれません。


Rephotoさんにはシンプルモードという携帯環境に非常に向いたモードがあります。これにはサムネールもあって今回のプログラム環境にぴったりです。しかも"Most Interested","Most Recent","R18"の3種類が存在します。これは素敵なので3種類全部に対応しました。


3種類への対応の仕方は読み込みURLの違いだけです。しかし今までの実装では3種類のパーサを実装しなければならない構造でしたのでパーサのインスタンスを得る場合に一度Factoryを通してその中でインデックスからURLへの変換を行っています。


今回HTMLをXmlPullParserで解析しておりますが、Xmlは非常に厳格でHTMLがタグを閉じていない場合に例外が発生してしまい解析ができません。ただXmlPullParserはストリームなため例外を捨ててしまえば続行が可能になるためParserExceptionを捨ててしまうという暴挙を行っています。そんなことができるのは今回のアプリの目的がURLさえ取れれば良いという物だからです。


さて今までは起動時のRSSサイトは固定でしたが、最後に使用したサイトを記憶して次の実行時に利用するようにしました。
AndroidではSQLiteの存在が有名で何でもSQLで書かなければならないのかと思っていたらちゃんと他にもデータの記憶方法が用意されていました。


Androidのアプリケーション情報の記憶には次の5種類が存在します。
http://code.google.com/android/devel/data.html

  • Preference
  • File
  • Database (SQLite)
  • ContentProvider
  • Network

このうち通常のJavaのPreferenceと同じように、今回の前回選択したサイトのような小さなコンフィグにはPreferenceが向いているでしょう。
ファイルは比較的大きな容量が保存できます。ファイルにはパスは指定できません。実は/data/dataの下のパッケージ名の下のfileの下という変な場所に保存されます。Androidのセキュリティはパーミションベースのため、デフォルトではアプリごとに違ったIDがオーナとなり他のアプリからはアクセスできないことになります。
レコードの件数が多い場合にはやはりDBですが、開発者に公開するのならContentProviderに発展させたほうが良いでしょう。公式チュートリアルのNotepadはContentProviderを使っておりませんが、更に改良したソースがsampleの下に存在しContentProviderの使用に変更してありますのでぜひご覧下さい。
最後にNetworkはもちろん良し悪しを考えた上で利用すれば良いと思います。


今回はPrefernceを用いました。Preferenceには名前ありとなしの2種類があります。名前ありは同じパッケージのアプリに公開できますが名前なしはプライベートになるそうです。今回は名前なしです。
使い方は上のドキュメントか私のソースをご覧下さい。

http://code.google.com/p/feedimageviewer/source/checkout

ドキュメントに従いonStopにて保存して、onCreateにて解凍しています。onFreezeにて作るBundle icicleとの使い分けがまた悩ましいところですね。ドキュメントに書いてあるほど厳格にonFreezeは呼ばれないような気がするのですが、気のせいでしょうか?