Shared Preferences, Retrofit과 같은 객체들은 싱글톤 패턴으로 앱이 실행될 때 한번만 생성해놓고 사용하는 것이 효율적이다.
(+ 데이터베이스 등등)
// 앱이 실행될때 1번만 실행
class ApplicationClass : Application() {
val API_URL = "-"
// 전역변수
companion object {
lateinit var prefs: SharedPreferences
lateinit var sRetrofit: Retrofit
}
// 앱이 처음 생성될 때
override fun onCreate() {
super.onCreate()
prefs =
applicationContext.getSharedPreferences("prefs", MODE_PRIVATE)
initRetrofitInstance()
}
private fun initRetrofitInstance() {
val client: OkHttpClient = OkHttpClient.Builder()
.readTimeout(5000, TimeUnit.MILLISECONDS)
.connectTimeout(5000, TimeUnit.MILLISECONDS)
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.addNetworkInterceptor(XAccessTokenInterceptor()) // 자동 헤더 전송
.build()
sRetrofit = Retrofit.Builder()
.baseUrl(API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
이렇게 ApplicationClass를 작성한 후, manifest 파일의 appliction 요소에
android:name=".ApplicationClass"
추가해주는 것 잊지 말기!!!
class XAccessTokenInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val builder: Request.Builder = chain.request().newBuilder()
val accessToken: String? = prefs.getString("accessToken", "")
if (accessToken != null) {
builder.addHeader("Authorization", "Bearer $accessToken")
}
return chain.proceed(builder.build())
}
}
그리고 로그인 시 액세스토큰을 shared preferences에 저장해놓고
서버에 요청을 보낼 때 자동으로 헤더를 붙여 토큰을 전송하도록 인터셉터를 달아줬다.
'* > Android' 카테고리의 다른 글
[안드로이드] 앱 목록에서 아이콘 안 보일 때 (0) | 2023.02.19 |
---|---|
[안드로이드] Activity, Fragment 간 데이터 주고받기 2 (0) | 2023.02.19 |
[안드로이드] Activity, Fragment 간 데이터 주고받기 (0) | 2022.10.21 |
[안드로이드] Cannot Resolve Symbol 'R' 해결 (0) | 2022.10.20 |
[안드로이드] ec2 서버와 통신 (2) | 2022.10.18 |