添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
214
207

More than 5 years have passed since last update.

新しく使えるようになった13個のSupport Annotations

Last updated at Posted at 2015-06-07

Google I/Oの What’s New in Android Development Tools (動画の24:07くらいから)で紹介されたsupport-annotations 22.2から使えるようになった新しい13のアノテーションについてメモ。

今回、お試しした環境は以下のとおり。
Android Mをターゲットにしていますがそれ以前のバージョンでも使えるのではないかと思います。

  • Mac OS X: 10.10.3
  • Android Studio: 1.3 Preview 2
  • Gradle plugin: 1.3.0-beta2
  • Build tools: 23.0.0 rc2
  • Target SDK: MNC
  • biuld.gradleのdependenciesに以下を追加するだけです。

    compile 'com.android.support:support-annotations:22.2.0'
    @WorkerThread, @UiThread, @MainThread, @BinderThread
    

    この4つのアノテーションはメソッドの実行スレッドを明示することができます。

        @WorkerThread
        private void myWorkerMethod(TextView textView) {
            textView.setText("Worker Thread!");
    

    このように@WorkerThreadでアノテーションしたメソッド内でUI操作を書くと「UIスレッドで呼んでね!」と怒ってくれます。

    逆に次のようにUIスレッドで動作させることを明示しているメソッドをAsyncTaskの中などで呼ぼうとした時にも怒ってくれます。

        @UiThread
        private void myUiMethod(TextView textView) {
            textView.setText("UI Thread!");
        public AsyncTask testTask() {
            return new AsyncTask() {
                @Override
                protected Object doInBackground(Object[] params) {
                    myWorkerMethod(mTextView);
                    myUiMethod(mTextView);
                    return null;
    @UiThread@MainThreadの違い
    

    ドキュメントによると、極めて稀なケースではあるがアプリが別ウインドウを実行するためにメインスレッドとは別のUIスレッドを作ることがあるらしい。
    なので、普通に使っている分には@UiThread@MainThreadの違いを気にする必要は無さそう。

    例としてメソッドにアノテーションを付与してみましたが、Viewの拡張クラスのようにクラス全体がUIスレッドで動作することが要求される場面ではクラスにアノテーションを付けることも可能とのこと。

    @Size

    メソッドの引数にサイズの最小値、最大値を指定したり、

        private void log(@Size(min = 1, max = 23) String tag) {
            Log.d(tag, "Logging!");
        private void sizeTest() {
            log("This is too long text for tag");
            log("Appropriate tag");
            log("");
    
        public void setViewPosition(@Size(2) int[] position) {}
        private void sizeTest2() {
            int[] position = new int[3];
            setViewPosition(position);
    

    配列のサイズを2の倍数に指定したり(x,y座標の組み合わせを受け取りたいときとか)、

        public void setViewPosition2(@Size(multiple = 2) int[] positions) {}
        public void sizeTest3() {
            int[] positions = new int[5];
            setViewPosition2(
    
    
    
    
        
    positions);
    

    というように引数のサイズを指定することが出来ます。
    ...が 不具合? なのか自分の環境では配列サイズの条件にマッチする引数を渡してもエラーになる...

    本日配信されたAndroid Studio 1.3 Preview 3で配列サイズの条件を満たしていてもエラーになる不具合が解消されていました。
    @IntRange, @FloatRange

    メソッド引数に渡される値の許容範囲を指定できます。

        private void setViewAlpha(@FloatRange(from = 0.0, to = 1.0) float alpha) {}
        private void testRange() {
            setViewAlpha(0.5f);
            setViewAlpha(100f);
    @ColorIntを付けた引数にリソースIDを渡すとエラーになります。

        private void setViewColor(@ColorInt int color) {}
        private void testColorInt() {
            setViewColor(Color.BLUE);
            setViewColor(android.R.color.black);
    public class ExtendedClass extends BaseClass {
        @Override
        public void baseMethod() {
            Log.d("TEST", "Do I have to call super?");
    
        @CheckResult(suggest = "#validate(int)")
        private boolean isValid() {
            return true;
        private boolean validate(int id) {
                // do validate something
            return true;
        private void testCheckResult() {
            isValid();
    
        @RequiresPermission(anyOf = {
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION})
        private void getLocation() {}
        @RequiresPermission(allOf = {
                Manifest.permission.READ_CALENDAR,
                Manifest.permission.WRITE_CALENDAR})
        private void updateCalendar() {}
        private void testPermission() {
            getLocation();
            updateCalendar();
    

    テスト用にクラス、メソッド、フィールドの可視範囲を広げることができます。

    とドキュメントには書いているんですが、privateなフィールドやメソッドにこのアノテーションをつけてもテストからはアクセス出来なかったです。
    使い方を間違っているのか不具合なのか...うまく使える方、使い方教えてください。

    コメント欄で@fkmさんに指摘頂きました。完全に自分のドキュメント読み間違えです。

    This annotation lets you declare that a class, method or field is more visible than necessary, in order to be able to access it from tests.

    とあるので「テストのためにクラス、メソッド、フィールドが必要以上の可視性を持っていることを明示できる」が正しいです。

    @Keep

    アプリの最小化時(Proguardのことかな?)に保持すべきメソッドやクラスにアノテーションを付けることができます。
    でもまだ使えません!

    うまく使えば入力値やメソッドの使い方をある程度制限することができるので、特に複数人で開発するようなときは期待しない使い方をされることを抑えてバグの混入を減らすのに役立つかもしれません。

    Google I/Oのセッション動画: Google I/O 2015 - What's New in Android Development Tools - YouTube
    ドキュメント: Support Annotations - Android Tools Project Site

    214
    207
    3

    Register as a new user and use Qiita more conveniently

    1. You get articles that match your needs
    2. You can efficiently read back useful information
    3. You can use dark theme
    What you can do with signing up
    214
    207