Aibolit for Android

Androidアプリケーションを開発するときにUIを初期化するプロセスはどれほど退屈です。 findViewbyId、setOnClickListener、getResources()。GetDrawable、...定型コードの山を何度も書く必要があります。この作業をAOPの肩にシフトしたいという自然な欲求があります。 おそらくハブで既に言及されたRoboGuiceのみで、Androidに適合した既製のソリューションのクイック検索 ただし、ライブラリにはかなりのサイズ(〜0.5 mb)があり、多くのアプリケーションでは受け入れられません。また、RoboApplicationおよびRoboActivityからアプリケーションクラスとアクティビティクラスを継承する必要があります。 そのため、 Aibolitが登場しました。これは、AndroidでUIを初期化するために依存性注入を使用する、簡単(〜40kb)で使いやすく機能的なライブラリです。


特徴




使用例


依存関係を接続します。
repositories { maven { url 'https://dl.bintray.com/alexeydanilov/maven' } } dependencies { compile 'com.danikula:aibolit:1.0' } 

注入する
 public class AibolitChatActivity extends Activity { // annotate fields to be injected... @InjectView(R.id.messageEditText) private EditText messageEditText; @InjectView(R.id.historyListView) private ListView historyListView; @InjectResource(R.string.symbols_count) private String symbolsCountPattern; @InjectSystemService(Context.NOTIFICATION_SERVICE) private NotificationManager notificationManager; @InjectService private HttpManager httpManager; @InjectResource(R.layout.content) private View content; ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat_activity); // initialize annotated fields and methods Aibolit.doInjections(this); // or just Aibolit.setInjectedContentView(this); ... } // annotate event handlers... @InjectOnClickListener(R.id.sendButton) private void onSendButtonClick(View v) { // handle onClick event } @InjectOnClickListener(R.id.clearHistoryButton) private void onClearHistoryButtonClick(View v) { // handle onClick event } @InjectOnTextChangedListener(R.id.messageEditText) public void onMessageTextChanged(CharSequence s, int start, int before, int count) { // handle text changed event } ... } 

コードは非常にシンプルで、findViewById、setOnClickListenerメソッドなどの呼び出しが完全に軽減されています。 代わりに:
  1. InjectViewアノテーションを使用して初期化する必要があるビューをマークします。
  2. イベントハンドラを定義し、対応するInjectOn *アノテーションでマークします。 この例では、ボタンをクリックしてテキストを変更するためのイベントハンドラーが定義されています。 Aibolitでは、すべての主要なイベントにハンドラーを追加できます。
    OnClick、OnLongClick、OnTouch、OnKey、OnTextChanged、OnCheckedChange、OnFocusChange、OnItemClick、OnItemSelected、OnEditorAction、OnCreateContextMenu;
  3. Aibolit.doInjections(this);メソッドを呼び出しAibolit.doInjections(this); アクティベーション用のコンテンツをインストールした後。

2つのメソッドの呼び出し
 setContentView(layoutId); Aibolit.doInjections(this); 

1つに置き換えることができます:
 Aibolit.setInjectedContentView(this); 

Aibolitでは、上記の例で行われているように、アプリケーションアプリケーションサービスを注入することもできます。
 @InjectService private HttpManager httpManager; 

これについては、Aibolitクラスのドキュメントをご覧ください。

仕組み


コードソースは公開され 、文書化さています。 舞台裏で何が起こっていますか? Aibolitは、Inject *アノテーションでマークされたフィールドとメソッドのクラスを分析します。 各アノテーションには独自のインジェクタークラスがあり、1つまたは別のリソースでフィールドを初期化します。 以下は、ビューの初期化を担当するこのようなインジェクターの例です。
 class ViewInjector extends AbstractFieldInjector<InjectView> { @Override public void doInjection(Object fieldOwner, InjectionContext injectionContext, Field field, InjectView annotation) { int viewId = annotation.value(); View view = injectionContext.getRootView().findViewById(viewId); if (view == null) { // throw exception... } if (!field.getType().isAssignableFrom(view.getClass())) { // throw exception... } try { field.setAccessible(true); field.set(fieldOwner, view); } catch (IllegalArgumentException e) { // throw exception... } catch (IllegalAccessException e) { // throw exception... } } } 

性能


ホリバーの理由を述べないために、私はちょうど乾燥した数字を与えます。 測定はエミュレータで行われました。 35の要素(ビュー、ライセンシー、アプリケーションリソース)を初期化する必要がありました。 従来のアプローチを使用する場合、1つのアクティビティから別のアクティビティへの移行には40〜50ミリ秒が必要でしたが、aibolitの使用は90〜100ミリ秒でした。 予想どおり、リフレクションベースのアプローチは時間がかかりますが、得られた違いIMHOは重要ではありません。

Aibolitは、完成品としても、ソリューションを作成するための基礎としても使用できます。 ライブラリコードは公開されており、Apacheライセンスバージョン2.0の下で配布されています。
私はコメントと提案を喜んでいます。

UPD 0:
同様のライブラリ
ロボギス
androidannotations

Source: https://habr.com/ru/post/J132126/


All Articles