AndroidにおけるRSSのパースに関しては、実はIBMのサイトで詳しく解説されている。
リンクで上げたページでは、パースの方法をいろいろ説明するためにFactoryを作っているけど
自分はandroid.sax.*を利用して実装した。
パースする前にHTTP GETするわけだけど、そのときに
httpget.setHeader("User-Agent", "Mozilla/5.0");
をセットし忘れないようにしないと、レスポンスがUTF-8で来てくれない。もっとも今はこれで平気だけど、何時ダメになるかわからないんですがね。。。
以前のエントリのようにAsyncTaskを利用して、HTTP GETして、
レスポンスを
protected List<message> doInBackground(String... params) {
String query;
query = "https://www.google.com/history/find?output=rss"+"&q="+params[0];
HttpGet httpget = new HttpGet(query);
httpget.setHeader("User-Agent", "Mozilla/5.0");
HttpResponse response;
List<message> messages = null;
try {
response = _HttpClient.execute(httpget);
int status_code = response.getStatusLine().getStatusCode();
if (status_code < 400){
InputStream istream = response.getEntity().getContent();
FeedParser parser = new AndroidSaxFeedParser(istream);
messages = parser.parse();
istream.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// TODO finalize
}
return messages;
}
のようにして取得する。(エラー処理とかははずしてしまったが。。。)
messagesには各RSSのアイテムが入っているので、
それぞれ値を取得してリストに表示させてやればいい。
今回は欲しい情報を得るのに、認証が必要でその処理がCookieを利用していた。 あんまりいい方法じゃないかもしれないが、一度認証済みのHttpClientを他のActivityでも使いまわしたいな。。。と思ったので、"android データ Activity"でググッたら出てくる出てくる。 簡単に言うとApplicationのインスタンスにデータを保持させて全体からそれを覗く。ということだ。 準備は
public class SingleConnectApp extends Application {
private DefaultHttpClient _HttpClient = null;
public void setHttpClient(DefaultHttpClient client) {
_HttpClient = client;
}
public DefaultHttpClient getHttpClient() {
return _HttpClient;
}
}
こんなクラスを作ってmanifestのapplicationタグを
<application android:icon="@drawable/gfoot_icon" android:label="@string/app_name" android:name="SingleConnectApp">
のようにして、onCreate内とかで
SingleConnectApp app = (SingleConnectApp)this.getApplication(); DefaultHttpClient client = app.getHttpClient();のようにすればActivity間でインスタンスを共有できる。
よくよく考えるとDefaultHttpClientを拡張してsingletonのクラス作れば同じこと出来んじゃね?てかソッチのが良いな。とか思ったけど、Applicationクラスにデータを持たしてみたかったのでそのまま進めた。

0 件のコメント:
コメントを投稿