본문 바로가기

안드로이드

(35)
Retrofit - 세션 유지하기 https://github.com/square/okhttp/tree/master/okhttp-urlconnection square/okhttp Square’s meticulous HTTP client for the JVM, Android, and GraalVM. - square/okhttp github.com 세션 ( Session ) 을 유지한다는 것은 쉽게 서버가 응답으로 보내는 쿠키 정보 ( "Set-Cookie" ) 를 다음 요청에 포함시킨다는 것을 말한다. 서버 요청에 주로 사용되는 Retrofit 은 단발성 요청만을 지원하기에 내부적으로 따로 세션을 유지해주지 않는다. 사실 API 기반의 요청이 주가 되는 안드로이드에서는 이러한 세션 유지는 크게 필요가 없다. 연결을 보장하기 위해선 대부분 T..
Error ) ViewPager2 - onAttachedToRecyclerView 에러 내용 java.lang.IllegalArgumentException at androidx.core.util.Preconditions.checkArgument(Preconditions.java:36) at androidx.viewpager2.adapter.FragmentStateAdapter.onAttachedToRecyclerView(FragmentStateAdapter.java:132) at androidx.recyclerview.widget.RecyclerView.setAdapterInternal(RecyclerView.java:1209) viewpager2에 adapter 연결 시에 크래시 발생 재현 경로 발견한 재현 경로는 2가지다. 더 있을수도 있음 첫 번째 Activity의 클래스 변수로..
Hilt - @SingletonComponent Hilt 2.28.2 버전부터 @ApplicationComponent 어노테이션이 @SingletonComponent 을 상속받는 형식으로 변경되었고, @ApplicationComponent 가 추후 릴리즈에서 제거된다고 알렸다. 이 말을 듣고 나니 @ApplicationComponent 인 모듈에서는 @Singleton 없이도 싱글톤으로 동작을 했었나??? @Singleton 을 없애고 돌려봤다. 미친 듯이 찍어 내는 걸 보니 아니다. 이슈를 훑어보니, hilt를 순수 자바 / 코틀린에서 도입할 경우 @ApplicationComponent 란 이름을 사용하는 것이 무슨 의미가 있는가? @ActivityScoped 와 같은 scope 역시 의미가 있는가? 라는 이슈가 있었고, 그에 대한 해답으로 @Sin..
Espresso intents - 카메라 촬영 테스트 하기 오늘은 에스프레소 테스트 도중에 카메라 촬영을 진행하는 방법을 알아보자. 시작하기 전에 만에 하나라도 카메라에 보이는 장면을 실제로 촬영하기를 원한다면 에스프레소만으로는 불가능하며 카메라 기능을 직접 구현하거나, 내가 직접 만든 카메라 앱과 함께 테스트하거나 두 가지 방법뿐이다. ( 물론 본인이 모든 카메라 앱의 버튼의 위치나 버튼 ID를 때려 맞출 자신이 있다면 가능하다. ) 그러니, 만약 그런 걸 원한다면 정신건강에 매우 해롭기 때문에, 깔끔하게 에스프레소랑은 거리를 두자. 우리의 목적은 인텐트를 조작하여 카메라가 실제로 촬영된 것처럼 돌아가도록 로직을 만들 것이다. 라이브러리 androidTestImplementation 'androidx.test.espresso:espresso-intents:3...
Android - java.time 패키지 안드로이드에서도 자바 8 지원으로 java.time 패키지를 사용할 수 있게 되었다. 이제 문제 덩어리 였던 Calender 버리고 java.time 패키지의 새로운 클래스인 LocalTime, LocalDate, LocalDateTime 들을 사용하면 된다. 코드는 전반적으로 joda-time 과 유사한 형태를 이루고 있고, 추가적인 개선이 이루어졌다고 한다. Java 8 은 gradle 에 아래와 같이 추가 하면 사용할 수 있다. compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } 날짜, 시간 가져오..
Android Hilt - WorkManager Dagger - Hilt 에 이어서 Hilt에서 워크 매니저에게 주입하는 법을 알아보려 한다. 방법은 간단한데, 굳이 작성한 이유는 "E/WM-WorkerWrapper: Could not create Worker" 에러 때문이다. 시작하기 implementation 'androidx.hilt:hilt-work:1.0.0-alpha01' 워크 매니저를 힐트와 함께 사용하려면 위의 라이브러리를 추가해야 한다. WorkFactory 설정하기 @HiltAndroidApp class UsageApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getW..
Android & Java - Reflection Reflection? 리플렉션은 자바 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근할 수 있도록 하는 API이다. private 변수나, 함수, 생성자 등의 정보에 접근이 가능하다. 테스트 클래스 class SampleClass private constructor(private val privateInt : Int, private val privateString: String) { private var privateField: Boolean = true private fun privateFunction(): Boolean { return false } } 위의 코드와 함께 설명하려 한다. 코드를 보면 생성자, 변수, 함수 죄다 private이다. 리플렉션을 통해서 생성하고, 변수를 조작하고, ..
Android & Java - Dynamic Proxy Dynamic Proxy? 간단하게 함수의 실행 전에 특정 인터페이스를 거치도록 만들 수 있는 자바 기능 중 하나이며, 컴파일 타임이 아닌 런타임에 만들 수 있는 프락시이다. 안드로이드에선 대표적으로 Retrofit 이 다이나믹 프록시를 사용하여 구현되어있다. 간단한 예제와 함께 설명하겠다. Dynamic Proxy 생성과 사용 interface ProxyInterface { fun doSomething() } val MyProxy = Proxy.newProxyInstance( ProxyInterface::class.java.classLoader, arrayOf(ProxyInterface::class.java), InvocationHandler { proxy, method, args -> doSomeTh..