정상에서 IT를 외치다

[Android, Dagger2] Dagger2 사용 예제 - 2. SharedPref 본문

안드로이드

[Android, Dagger2] Dagger2 사용 예제 - 2. SharedPref

Black-Jin 2018. 10. 4. 15:45
반응형


안녕하세요. 블랙진 입니다.

Dagger2 에 대한 3번째 포스팅을 시작하겠습니다.


이전 포스팅

Dagger2 사용 예제

DI기본 개념과 Dagger2 사용 예제


이전 포스팅에서 Dagger2 기본 예제에 대해 살펴 보았습니다.

이번에는 Dagger2 를 사용하여 SharedPref 를 다뤄보겠습니다.

아래 예제는 이 사이트 예제를 조금 수정해서 정리해 봤습니다.


기존 에는 SharedPref 를 아래와 같이 사용했습니다.

public class MainActivity extends AppCompatActivity {

private SharedPreferences sharedPreferences;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.edit().putString("status","sucess!").apply();

Log.d("MyTag","get : " + sharedPreferences.getString("status",null));

}

}

이를 Dagger2 를 사용한 예제로 변경해 보겠습니다.



1. ApplicationModule

@Module
public class ApplicationModule {
private Application mApp;

ApplicationModule(Application app) {
mApp = app;
}

@Provides
@Singleton
SharedPreferences provideSharedPrefs() {
return PreferenceManager.getDefaultSharedPreferences(mApp);
}
}

위와 같이 모듈을 만들어 줍니다. mApp 변수를 가져오기 위해 ApplicationModule(Application app) 라는 생성자를 만들었습니다. 또한 SharedPreferences 는 같은 객체 1개만 있으면 되기 때문에 @singletone 어노테이션을 설정했습니다.



2. ApplicationComponent

@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {

void inject(MainActivity activity);
}

MainActivity 에 sharedPref 를 주입할 예정입니다.



3. DemoApplication

public class DemoApplication extends Application {

private ApplicationComponent mComponent;

@Override
public void onCreate() {
super.onCreate();

mComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}

public ApplicationComponent getComponent() {
return mComponent;
}
}

Application 단계에서 component 를 최초 초기화 해줍니다.

이렇게 해줌으로써 Module 에서 제공하는 SharedPref 를 최초 한번 초기화 해줄 수 있습니다.

그럼 이 초기화 한 SharedPref 를 어떻게 공급할 수 있을까요?



4. MainActivity

public class MainActivity extends AppCompatActivity {

@Inject
SharedPreferences mSharedPrefs;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

((DemoApplication) getApplication())
.getComponent()
.inject(this);

mSharedPrefs.edit()
.putString("status", "success!")
.apply();

Log.d("MyTag","getString : " + mSharedPrefs.getString("status","null"));

}

}

Application 단계에서 최초 초기화 한 Component 객체에  MainActivity 로 SharedPref 를 주입하라는 로직을 작성합니다.

 ((DemoApplication) getApplication())
.getComponent()
.inject(this);

그렇게 하면 변수로 선언한 

@Inject
SharedPreferences mSharedPrefs;

mSharedPrefs 에 자동으로 객체가 주입 되어 사용할 수 있게 됩니다!!!

로그를 확인 하면 success! 를 보실 수 있을꺼에요!!




추가 적으로 Named 어노테이션을 사용하여 SharedPref 를 분리해서 사용해 보겠습니다.


1. ApplicationModule

@Module
public class ApplicationModule {
private Application mApp;

ApplicationModule(Application app) {
mApp = app;
}

/*@Provides
@Singleton
SharedPreferences provideSharedPrefs() {
return PreferenceManager.getDefaultSharedPreferences(mApp);
}*/

@Provides
@Singleton
@Named("default")
SharedPreferences provideDefaultSharedPrefs() {
return PreferenceManager.getDefaultSharedPreferences(mApp);
}

@Provides
@Singleton
@Named("secret")
SharedPreferences provideSecretSharedPrefs() {
return mApp.getSharedPreferences("secret", Activity.MODE_PRIVATE); }
}

ApplicationModule 단계에서 default 와 secret 의 두가지 종류의 SharedPref 를 초기화 해줍니다.



2. MainActivity

public class MainActivity extends AppCompatActivity {

@Inject
@Named("default")
SharedPreferences mDefaultSharedPrefs;

@Inject
@Named("secret")
SharedPreferences mSecretSharedPrefs;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

((DemoApplication) getApplication())
.getComponent()
.inject(this);

mDefaultSharedPrefs.edit()
.putString("status", "success!")
.apply();

mSecretSharedPrefs.edit()
.putString("status", "another success!")
.apply();

Log.d("MyTag","getString : " + mDefaultSharedPrefs.getString("status","null"));
Log.d("MyTag","getString : " + mSecretSharedPrefs.getString("status","null"));

}

}


Component를 불러와 MainActivity 에서 선언한

    @Inject
@Named("default")
SharedPreferences mDefaultSharedPrefs;

@Inject
@Named("secret")
SharedPreferences mSecretSharedPrefs;

위 두 변수에 객체를 주입해 줍니다. 이때 Named 를 통해 각기 다른 객체를 주입해 줄 수 있습니다.



반응형
Comments