ごく普通の在日

Androidアプリ「はてブ・ビュー」を公開しました【技術編】

宣伝編を書いたので技術について

はてブ・ビュー
はてブ・ビュー
Google Playストアでダウンロードする

技術的に難しいことはなく、はてなブックマークの各ジャンルのRSSフィードを読み込んで表示しているだけ

はてブ・ビューはAndroid 2.2 以上サポートしているが、ActionBarやNavigation Drawerを使っている。
また、今回のアプリは初めていちからPlayストア公開までAndroid Studioで作成したものだ。


VolleyでRSSフィードを読み込む

Android volleyのRequestを拡張しRSSを読み込んでみた。 サンプル:
public class RssRequest extends Request<ArrayList<RssItem>> {
    private final Response.Listener<ArrayList<RssItem>> mListener;

    public RssRequest(int method, String url, Response.Listener<ArrayList<RssItem>> mListener,
                      Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.mListener = mListener;
    }

    @Override
    protected Response<ArrayList<RssItem>> parseNetworkResponse(NetworkResponse response) {
        InputStream is = new ByteArrayInputStream(response.data);
        ArrayList<RssItem> itemList = new ArrayList<RssItem>();
        XmlPullParser parser = Xml.newPullParser();
        try {
            parser.setInput(is, null);
            int eventType = parser.getEventType();
            RssItem currentItem = null;
            int itemCount = 0;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tag;
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        tag = parser.getName();
                        if (tag.equals("item")) {
                            currentItem = new RssItem();
                        } else if (currentItem != null) {
                            if (tag.equals("title")) {
                                currentItem.setTitle(parser.nextText());
                            } else if (tag.equals("description")) {
                                currentItem.setText(parser.nextText());
                            } else if (tag.equals("link")) {
                                currentItem.setLink(parser.nextText());
                            } else if (tag.equals("date")) {
                                currentItem.setDate(parser.nextText());
                            } else if (tag.equals("subject")) {
                                currentItem.setCategory(parser.nextText());
                            } else if (tag.equals("bookmarkcount")) {
                                currentItem.setBookmarkCount(Integer.valueOf(parser.nextText()));
                            } else if (tag.equals("encoded")) {
                                currentItem.setContent(parser.nextText());
                            }

                        }
                        break;
                    case XmlPullParser.END_TAG:
                        tag = parser.getName();
                        if (tag.equals("item")) {
                            currentItem.setItemCount(itemCount);
                            itemList.add(currentItem);
                            itemCount++;
                        }
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            Log.e("ERROR", "on parseXML = " + e.getMessage());
        }

        return Response.success(itemList, getCacheEntry());
    }

    @Override
    protected void deliverResponse(ArrayList<RssItem> response) {
        this.mListener.onResponse(response);
    }

}

ActionBarActivityについて

Android API level 11から追加されたActionBarをそれ以下のバージョンで使いたいときにActionBarActivityを使う。Android Supportのv7 appcompat libraryを読み込んで使うことができる。

Android Studioのbuild.gradleに追加する場合
compile 'com.android.support:appcompat-v7:18.0.+'
例:
public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionbar = getSupportActionBar();
        actionbar.setDisplayHomeAsUpEnabled(true);
        actionbar.setHomeButtonEnabled(true);
    }
...

Navigation Drawer

作成方法とサンプルは以下のページを読めばだいたい知りたいことは書かれてある。
Creating a Navigation Drawer http://developer.android.com/training/implementing-navigation/nav-drawer.html

はてブ・ビューのソースコードは公開してもいいかなと思っているけど、そもそもこれを公開するメリットが見えないからな

以上



宣伝編を書いたので技術について

はてブ・ビュー
はてブ・ビュー
Google Playストアでダウンロードする

技術的に難しいことはなく、はてなブックマークの各ジャンルのRSSフィードを読み込んで表示しているだけ

はてブ・ビューはAndroid 2.2 以上サポートしているが、ActionBarやNavigation Drawerを使っている。
また、今回のアプリは初めていちからPlayストア公開までAndroid Studioで作成したものだ。


VolleyでRSSフィードを読み込む

Android volleyのRequestを拡張しRSSを読み込んでみた。 サンプル:
public class RssRequest extends Request<ArrayList<RssItem>> {
    private final Response.Listener<ArrayList<RssItem>> mListener;

    public RssRequest(int method, String url, Response.Listener<ArrayList<RssItem>> mListener,
                      Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.mListener = mListener;
    }

    @Override
    protected Response<ArrayList<RssItem>> parseNetworkResponse(NetworkResponse response) {
        InputStream is = new ByteArrayInputStream(response.data);
        ArrayList<RssItem> itemList = new ArrayList<RssItem>();
        XmlPullParser parser = Xml.newPullParser();
        try {
            parser.setInput(is, null);
            int eventType = parser.getEventType();
            RssItem currentItem = null;
            int itemCount = 0;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tag;
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        tag = parser.getName();
                        if (tag.equals("item")) {
                            currentItem = new RssItem();
                        } else if (currentItem != null) {
                            if (tag.equals("title")) {
                                currentItem.setTitle(parser.nextText());
                            } else if (tag.equals("description")) {
                                currentItem.setText(parser.nextText());
                            } else if (tag.equals("link")) {
                                currentItem.setLink(parser.nextText());
                            } else if (tag.equals("date")) {
                                currentItem.setDate(parser.nextText());
                            } else if (tag.equals("subject")) {
                                currentItem.setCategory(parser.nextText());
                            } else if (tag.equals("bookmarkcount")) {
                                currentItem.setBookmarkCount(Integer.valueOf(parser.nextText()));
                            } else if (tag.equals("encoded")) {
                                currentItem.setContent(parser.nextText());
                            }

                        }
                        break;
                    case XmlPullParser.END_TAG:
                        tag = parser.getName();
                        if (tag.equals("item")) {
                            currentItem.setItemCount(itemCount);
                            itemList.add(currentItem);
                            itemCount++;
                        }
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            Log.e("ERROR", "on parseXML = " + e.getMessage());
        }

        return Response.success(itemList, getCacheEntry());
    }

    @Override
    protected void deliverResponse(ArrayList<RssItem> response) {
        this.mListener.onResponse(response);
    }

}

ActionBarActivityについて

Android API level 11から追加されたActionBarをそれ以下のバージョンで使いたいときにActionBarActivityを使う。Android Supportのv7 appcompat libraryを読み込んで使うことができる。

Android Studioのbuild.gradleに追加する場合
compile 'com.android.support:appcompat-v7:18.0.+'
例:
public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionbar = getSupportActionBar();
        actionbar.setDisplayHomeAsUpEnabled(true);
        actionbar.setHomeButtonEnabled(true);
    }
...

Navigation Drawer

作成方法とサンプルは以下のページを読めばだいたい知りたいことは書かれてある。
Creating a Navigation Drawer http://developer.android.com/training/implementing-navigation/nav-drawer.html

はてブ・ビューのソースコードは公開してもいいかなと思っているけど、そもそもこれを公開するメリットが見えないからな

以上