Форум программистов, компьютерный форум CyberForum.ru

Не до конца понимаю Dagger2 - Android

Войти
Регистрация
Восстановить пароль
 
arvalon
 Аватар для arvalon
15 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 81
16.09.2016, 15:42     Не до конца понимаю Dagger2 #1
Доброго дня.
Изучаю библиотеку Dagger2 для реализации Dependency Injection
Кодил проект из del
 Комментарий модератора 
кода на форуме достаточно


Что в итоге получилось:
Класс Motor
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Motor {
 
    private int rpm;
 
    public Motor(){
        this.rpm = 10; //default will be 10
    }
 
    public int getRpm(){
        return rpm;
    }
 
    public void accelerate(int value){
        rpm = rpm + value;
    }
 
    public void brake(){
        rpm = 0;
    }
}

Класс Vehicle
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Vehicle {
 
    private Motor motor;
 
    @Inject
    public Vehicle(Motor motor){
        this.motor = motor;
    }
 
    public void increaseSpeed(int value){
        motor.accelerate(value);
    }
 
    public void stop(){
        motor.brake();
    }
 
    public int getSpeed(){
        return motor.getRpm();
    }
}

Класс-модуль VehicleModule
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Module
public class VehicleModule {
/*
    @Provides
    @Singleton
    Motor provideMotor(){
        return new Motor();
    }
*/
    @Provides
    @Singleton
    Vehicle provideVehicle(){
        return new Vehicle(new Motor());
    }
 
}

Компонент-интерфейс VehicleComponent
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
    Vehicle provideVehicle();
    void inject(MainActivity mainActivity);
}

build.gradle, где больше всего в итоге ковырялся
Кликните здесь для просмотра всего текста
JSON
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
 
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // replace with the current version of the Android plugin
        classpath 'com.android.tools.build:gradle:1.3.0'
        // the latest version of the android-apt plugin
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}
 
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.1"
 
    defaultConfig {
        applicationId "ru.arvalon.dagger2vehiclemotor2"
        minSdkVersion 19
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
 
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile 'com.google.dagger:dagger:2.7'
    compile 'com.google.dagger:dagger-compiler:2.7'
    compile 'org.glassfish:javax.annotation:10.0-b28'
}


Класс 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
26
27
28
29
30
31
32
33
34
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
 
import javax.inject.Inject;
 
public class MainActivity extends AppCompatActivity {
 
    @Inject
    Vehicle vehicle;
 
    //@Inject
    //Motor motor;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        VehicleComponent component=DaggerVehicleComponent.create();
 
        component.inject(this);
 
        vehicle.increaseSpeed(20);
 
        Toast.makeText(this,String.valueOf(vehicle.getSpeed()),Toast.LENGTH_LONG).show();
 
        vehicle.stop();
 
        //motor.accelerate(100);
 
    }
}


И это заработало. Но не понимаю зачем в классе Vehicle конструктору класса аннотация @Inject? Работает и без неё.
Java
1
2
3
4
@Inject
    public Vehicle(Motor motor){
        this.motor = motor;
    }
Инджектися же поле vehicle типа Vehicle уже в MainActivity. А мотор и машина связываются в модуле.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2016, 15:42     Не до конца понимаю Dagger2
Посмотрите здесь:

Android Отследить прокручивание ListView до конца
Android Сдвиг item в ListView не до конца, а под ним кнопка
Телефон не до конца определился ОС Android
Android Не понимаю результат операции деления
Android Подгрузка данных при достижении конца списка
SoundPool - не воспроизводит до конца звук Android
Android View Pager разные фрагменты на страницах, не понимаю как?
Android Выделить подстроку с конца
Не понимаю нехватку памяти Android
Android Как сделать, чтобы ListView читалось с конца
Android Определить достижение конца экрана
Android Filterable не понимаю как в адаптере взять String значение по позиции ?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 11:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru