Android+JsonPullParser

2013-11-14T12:00:00+00:00 Android Java

AndroidでJsonPullParserを使うっていうネタ。まぁ公式にもサンプルあるしそれ参考にすれば良いんじゃねって所なんで

※@JsonModel等は前回のをそのまま利用

MainActivity.java

package sample.test.jpp;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import net.vvakame.util.jsonpullparser.JsonFormatException;

public class MainActivity extends Activity {

    private static final String TAG = MainActivity.class.getName();
    private ArrayAdapter<String> mAdapter;
    private ListView mListView;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        mListView = new ListView(this);
        mListView.setAdapter(mAdapter);

        setContentView(mListView);
    }

    @Override
    protected void onStart() {
        super.onStart();

        List<Repository> repositories = getRepositories();
        for (Repository repository : repositories) {
            mAdapter.add(repository.getName());
        }

        mAdapter.notifyDataSetChanged();
    }

    List<Repository> getRepositories() {
        List<Repository> repositories = new ArrayList<Repository>();

        try {
            URL url = new URL(Repository.URL);
            HttpsURLConnection conn = null;

            try {
                conn = (HttpsURLConnection)url.openConnection();
                repositories = RepositoryGen.getList(conn.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JsonFormatException e) {
                e.printStackTrace();
            } finally {
                if (conn != null) {
                    conn.disconnect();
                    conn = null;
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return repositories;
    }
}

もろUIThreadでネット通信しているからAndroid4.x系ではエラーになりそうな気がするけど

でEclipseで開発する分には注釈処理なファクトリーパスとか設定すればいいけど、antを使ってビルドするようなケース(Jenkinsとか?)の場合には公式にあるcustom_rules.xmlを使えば良い

<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules">
    <target name="-pre-compile">
        <!-- pre-compile時に-processorする際にandroidパッケージが解決できないエラーが出るけどソースの生成は出来る。それが気になる場合には bootclasspathref="project.target.class.path" を追加すれば良い? -->
        <javac fork="yes" srcdir="${src}" compiler="javac1.6" encoding="UTF-8" includeantruntime="false">
            <compilerarg line="-proc:only" />
            <compilerarg line="-classpath ${apt.processor.dir}/*" />
            <compilerarg line="-processor net.vvakame.util.jsonpullparser.factory.JsonAnnotationProcessor" />
            <compilerarg line="-s ${gen}" />
            <compilerarg line="-AJsonPullParserClassPostfix=${jpp.genclass.postfix}" />
        </javac>
    </target>
</project>

な感じで大体そのまま取ってきて、ant.propertiesで

gen=gen
src=src
apt.processor.dir=factory
jpp.genclass.postfix=Gen

な感じでぶち込む。factoryディレクトリにjsonpullparser-aptなライブラリをぶち込んでおけば良い。あとは「ant clean release」等を利用してAPT処理されたソースが生成されてちゃんとビルド出来るか確認しておく

slf4j jsonpullparser