LoginSignup
14
14

More than 5 years have passed since last update.

脱Android Annotationsのために、onActivityResultの処理を楽にするライブラリを作った

Last updated at Posted at 2016-02-05

Androidアプリ開発を楽にするため、View Injectionとかスレッド制御としてAndroid Annotationを使っていたのですが、下記の問題のため別なライブラリに移行することにしました。

Android Annotationsの問題点

  • クラス数が増える
    • Multi Dex限界が近くなる
  • ビルド時間が長い
    • APTで自動生成されるので、その分非力な環境でのビルドが長くなる
  • Android NDKとマトモな方法では組み合わせられない
    • Plugin構成が変わるので、aptが正常に動かなかった
  • ライブラリプロジェクトでは一部のAnnotation利用が制限される
    • APTで静的にIDが解決されるので、ライブラリプロジェクトはView系機能とかが使えない

特にAndriders Central Engineではビルド時間のあまりにも長くなり、マトモに開発を継続できる状態じゃ無くなってしまいました。ついでに、ライブラリプロジェクトの制限とかで設計の制約も煩わしくなってきました。

既存の移行先ライブラリ

そこで脱Android Annotationsするために移行先のライブラリを探しました。幾つかは非常に優れたライブラリがありました。

  • ViewById/Click系アノテーション(View取得)
  • InstanceStateアノテーション(ステート保存)
  • Background/UiThreadアノテーション(スレッド制御)
    • 無理なので諦めた
  • OnActivityResultアノテーション(OnActivityResult自動振り分け)
    • いいのがない

結局ググッてもOnActivityResultアノテーション(自動的にonActivityResultで処理の振り分けをする)というライブラリは見つかりませんでした。移行する上で必要なのは少なくとも下記の機能。

  • 特定シグニチャのメソッドにアノテーションをつけるだけで使える
  • クラスを生成せず、Runtimeで解決してくれる

OnActivityResultの移行

ないものはなんとか作るしか無いので、自作したのがOnActivityResult-invokeです。

Android Annotationsと互換性(というか、旧コードからの移行もあるので)を保持するため、アノテーションの使い方は本家と同じにしてあります。自動呼び出しは不可なので、onActivityResult時にActivityResult.invoke()を呼び出すという点が異なります。

BaseActivityのようなものを作っておいて、そっちで呼び出せば継承先は自動で呼び出しが行われるはずです。

本家より高機能な点として、"ChildFragmentを再帰的に呼び出し可能"と、"Activity/Fragment以外の型でもInvokeできる"という機能があります。

Java

public class MainActivity extends AppCompatActivity {
    static final int REQUEST_REQUEST_PICK1 = 0x0001;
    static final int REQUEST_REQUEST_PICK2 = 0x0002;
    static final int REQUEST_OTHER = 0x0003;

    // いろいろ処理...

    @OnActivityResult(REQUEST_REQUEST_PICK1)
    void resultPickImage1(int resultCode, Intent data) {
        Toast.makeText(this,
                String.format("resultPickImage1 code(%d)", resultCode),
                Toast.LENGTH_SHORT
        ).show();
    }

    @OnActivityResult(REQUEST_REQUEST_PICK2)
    void resultPickImage2(int resultCode, Intent data) {
        Toast.makeText(this,
                String.format("resultPickImage2 code(%d)", resultCode),
                Toast.LENGTH_SHORT
        ).show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!ActivityResult.invoke(this, requestCode, resultCode, data)) {
            // handle failed
            Toast.makeText(this,
                    String.format("failed request(%d) result(%d)", requestCode, resultCode),
                    Toast.LENGTH_SHORT
            ).show();
        }
    }
}

最後に

Background/UiThreadアノテーションを移行できるライブラリがあったら教えてくれるとありがたいです。

14
14
0

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
14
14