mattak's blog

気の向くままに書く

Volley on gradle

Volley

Google IO 2013で発表された非同期通信用のライブラリ。 今まで、AsyncTask+(HttpURLConnection | ApacheHttpClient)で行っていた部分を置き換えるられる.

発表の動画 http://www.youtube.com/watch?v=yhv8l9F44qo

使い方

  1. git clone https://android.googlesource.com/platform/frameworks/volley
  2. import
  3. Volley.newRequestQueue(context)

antでのjar化

$ ant jar

bin/volley.jarができる

gradleでのaar化

まだmaven centralにあがってなかったので、とりあえずローカルレポジトリに吐いて使えるようにする。 build.gradleを微修正

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.0'
    }
}

apply plugin: 'android-library'
apply plugin: 'maven'

def code     = 1
def version  = '1.0'
def group    = 'com.android'
def name     = 'volley'
def home     = System.getProperty("user.home")
def repos    = "file://$home/project/android-Repository/"

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: repos
            pom.version    = version
            pom.groupId    = group
            pom.artifactId = name
        }
    }
}

android {
    compileSdkVersion 17
    buildToolsVersion = 17

    sourceSets {
        defaultConfig {
            testPackageName 'com.android.volley.tests'
        }

        main {
            assets.srcDirs       = ['assets']
            res.srcDirs          = ['res']
            aidl.srcDirs         = ['src']
            resources.srcDirs    = ['src']
            renderscript.srcDirs = ['src']
            java.srcDirs         = ['src']
            manifest.srcFile 'AndroidManifest.xml'

        }

        instrumentTest {
            assets.srcDirs    = ["tests/assets"]
            res.srcDirs       = ["tests/res"]
            resources.srcDirs = ["tests/src"]
            java.srcDirs      = ["tests/src"]
        }
    }
}

ローカルレポジトリにaarをはく。

$ gradle clean uploadArchives

ホントはjarで吐きたいけど、android-library pluginを使ったときに、jarで吐く方法がわからなかった。

プロジェクトで利用する

build.gradleを以下のように編集.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android'

def home     = System.getProperty("user.home")
def repos    = "file://$home/project/android-Repository/"

repositories {
    mavenCentral()
    maven {
        url repos
    }
}

dependencies {
    compile 'com.android.support:support-v4:13.0.+'
    compile 'com.android:volley:1.0'
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 17
    }
}

試してみる。

package me.mattak.volley_sample;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends Activity {
    private RequestQueue mQueue;
    private String TAG_VOLLEY = "[main]";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
        request();
    }

    protected void onStop() {
        super.onStop();
        mQueue.cancelAll(TAG_VOLLEY);
    }

    private void init() {
        mQueue = Volley.newRequestQueue(getApplicationContext());
    }

    private void request() {
        final TextView tv = (TextView) findViewById(R.id.main_text);

        Request request = new StringRequest(Request.Method.GET, "http://ifconfig.me/ip", new Response.Listener<String>(){
            public void onResponse(String message) {
                tv.setText(message);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                tv.setText(volleyError.getLocalizedMessage());
            }
        });

        request.setTag(TAG_VOLLEY);

        mQueue.add(request);
    }
}