일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 면접
- T자형인재
- 프래그먼트
- 베드테이블
- 아비투스
- 베드트레이
- 한달어스
- 한단어의힘
- 어떻게 나답게 살 것인가
- 브런치작가되기
- 북한살둘레길
- 지지않는다는말
- 캐치마인드
- 끝말잇기
- 소프시스
- 함수형 프로그래밍
- 한달독서
- 1일1커밋
- 한달브런치북만들기
- 안드로이드
- 소프시스 밤부 좌식 엑슬 테이블
- 목적 중심 리더십
- 테트리스
- 목적중심리더십
- 커스텀린트
- 재택근무
- 좌식테이블
- 슬기로운 온라인 게임
- 리얼하다
- 자취필수템
- Today
- Total
정상에서 IT를 외치다
[Android, Dagger2] Dagger2 사용 예제 - 2. SharedPref 본문
안녕하세요. 블랙진 입니다.
Dagger2 에 대한 3번째 포스팅을 시작하겠습니다.
이전 포스팅
이전 포스팅에서 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 를 통해 각기 다른 객체를 주입해 줄 수 있습니다.
'안드로이드' 카테고리의 다른 글
[Android, Mockito] Unit Test using Mockito (2) | 2018.10.05 |
---|---|
[Android, Test ] UnitTest, UiTest 기본 예제 (1) | 2018.10.05 |
[Android, Dagger2] Dagger2 사용 예제 - 1 (0) | 2018.10.04 |
[Android, Dagger2] DI 기본 개념과 Dagger2 사용 예제 - 놈!놈!놈! (6) | 2018.10.01 |
[Android, ItemDecoration] 리사이클러뷰에 아이템데코레이션 사용하기 (2) | 2018.09.19 |