Пример использования библиотеки RoboGuice (Dependency Injection для Андроид)

| 28.05.2014

Библиотека RoboGuice позволяет использовать «внедрение зависимостей и ресурсов» в Андроид-приложениях. Если вы работали с Java, в частности, с Hibernate, то понятие Dependency Injection вам должно быть хорошо знакомо.

Давайте взглянем на простейшее приложение. У нас есть layout, в котором имеются три элемента TextView. После запуска приложения в метода onStart() мы инициализируем нужные TextView и прописываем в них текстовые значения из строковых ресурсов. В этом примере MainActivity обычно выглядит так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package ru.androiddocs.injectionexample;
 
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    TextView text;
    TextView textSecond;
    TextView textThird;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        text = (TextView) findViewById(R.id.textView1);
        textSecond = (TextView) findViewById(R.id.textView2);
        textThird = (TextView) findViewById(R.id.textView3);
 
        text.setText(R.string.text1);
        textSecond.setText(R.string.text2);
        textThird.setText(R.string.text3);		
    }
}

Как видим из примера, несколько строчек мы потратили на то, чтобы найти и инициализировать элементы TextView с помощью метода findViewById().

А теперь давайте сделаем тоже самое, но с использованием Dependency Injection. Прежде всего, нам необходимо добавить в наш проект в директорию libs библиотеки:

RoboGuice 2.0
Guice 3.0-no_aop

Взять их можно отсюда.

Также добавьте сюда же jar-архив библиотеки javax.inject

Видоизменим наш класс MainActivity.java следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package ru.androiddocs.injectionexample;
 
import android.os.Bundle;
import android.widget.TextView;
 
import roboguice.activity.RoboActivity;
import roboguice.inject.InjectView;
 
public class MainActivity extends RoboActivity {
 
    @InjectView(R.id.textView1) TextView text;
    @InjectView(R.id.textView2) TextView textSecond;
    @InjectView(R.id.textView3) TextView textThird;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        text.setText(R.string.text1);
        textSecond.setText(R.string.text2);
        textThird.setText(R.string.text3);
 
    }
}

Обратите внимание, что здесь мы наследуемся не от Activity, а от класса RoboActivity.

Пример использования библиотеки RoboGuice

Как видим, код стал немного короче, за счет того, что мы использовали внедрение нужных ресурсов с помощью аннотации @InjectView. В больших проектах сокращение кода может быть более значительной.

Однако, у данного подхода есть главный недостаток — это потребление дополнительных ресурсов на сканирование аннотаций в вашем коде. Поэтому, прежде, чем использовать Dependency Injection в вашем приложении, тщательно все обдумайте и взвесьте.

Больше примеров можно найти здесь

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*