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 件のコメント:
コメントを投稿