package org.android.textbook.lesson4.httpclientsample;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.params.HttpConnectionParams;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.util.Xml;
public class RssLoadingAsyncTask extends AsyncTask<String, Void, List<RssItem>> {
RssLoadingAsyncTaskListener mRssLoadingAsyncTaskListener;
public interface RssLoadingAsyncTaskListener {
public void onStartTask();
public void onEndTask(List<RssItem> item);
}
public RssLoadingAsyncTask(RssLoadingAsyncTaskListener listener){
mRssLoadingAsyncTaskListener = listener;
}
@Override
protected void onPreExecute() {
mRssLoadingAsyncTaskListener.onStartTask();
}
@Override
protected List<RssItem> doInBackground(String... urls) {
List<RssItem> rssItemList = null;
if (isCancelled()) {
// キャンセルされた場合は終了
} else {
}
String url = "http://www.sbcr.jp/topics/atom.xml";
rssItemList = getRssItems(url);
return rssItemList;
}
@Override
protected void onPostExecute(List<RssItem> result) {
mRssLoadingAsyncTaskListener.onEndTask(result);
}
private List<RssItem> getRssItems(String url) {
List<RssItem> items = null;
InputStream inputStream;
// HTTPクライアントのインスタンス取得
AndroidHttpClient httpClinet =
AndroidHttpClient.newInstance("Android");
// パラメータの設定
HttpConnectionParams.setConnectionTimeout(
httpClinet.getParams(), 10000);
HttpConnectionParams.setSoTimeout(httpClinet.getParams(), 10000);
// HttpGetのリクエスト生成
HttpGet request = new HttpGet(url);
try {
HttpResponse response;
// HttpGetリクエストの実行
response = httpClinet.execute(request);
// レスポンスの取得
if (response.getStatusLine().getStatusCode()
== HttpStatus.SC_OK) {
// コンテンツの取得
final HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
if (inputStream != null) {
items = parseXmlContent(inputStream);
inputStream.close();
}
} else {
// HttpStatusがエラーで返ってきた
}
// 切断
httpClinet.close();
} catch (IOException e) {
// HttpGetの失敗
e.printStackTrace();
}
return items;
}
private List<RssItem> parseXmlContent(InputStream inputStream) {
List<RssItem> rssItemList = new ArrayList<RssItem>();
XmlPullParser parser = null;
try {
// XmlPullParserのインスタンスを取得
parser = Xml.newPullParser();
// parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(inputStream, "UTF-8");
// 解析する
RssItem item = null;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
// <title>タグを発見
if (parser.getName().equals("title")) {
item = new RssItem(); // テキストを取得
item.setTitle(parser.nextText());
rssItemList.add(item);
android.util.Log.e("", "" + item.getTitle());
}
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.TEXT:
break;
default:
break;
}
// 次のイベントを取得
eventType = parser.next();
}
} catch (XmlPullParserException e) {
// ファイルフォーマットの不正など
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return rssItemList;
}
}