일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 안드로이드 os 구조
- 2022 플러터 설치
- 큐 자바 코드
- 스택 큐 차이
- android ar 개발
- android retrofit login
- 안드로이드 레트로핏 사용법
- 안드로이드 라이선스 종류
- 안드로이드 유닛 테스트
- 객체
- 서비스 쓰레드 차이
- ar vr 차이
- 스택 자바 코드
- 멤버변수
- jvm이란
- 안드로이드 유닛테스트란
- jvm 작동 원리
- rxjava hot observable
- rxjava cold observable
- 자바 다형성
- Rxjava Observable
- ANR이란
- rxjava disposable
- 2022 플러터 안드로이드 스튜디오
- 서비스 vs 쓰레드
- 안드로이드 유닛 테스트 예시
- 플러터 설치 2022
- 안드로이드 라이선스
- 클래스
- 안드로이드 레트로핏 crud
- Today
- Total
목록2024/02 (14)
나만을 위한 블로그
Compose로 앱을 만들다가 하단 탭이 필요한 시점이 와서 구현하고, 어떻게 구현했는지 그 방법을 정리해 둔다. 먼저 sealed class로 앱에서 표시할 화면을 정의해 둔다. 꼭 sealed class가 아니라도 상관없다. sealed class AppScreen( val route: String, @StringRes val resourceId: Int, ) { object Home: AppScreen("home", R.string.home) object Favorite: AppScreen("favorite", R.string.favorite) object MyPage: AppScreen("mypage", R.string.my_page) } 이 클래스는 본인이 어떤 화면들을 만들 건지에 따라 구현이..
Compose로 앱을 만들던 중 CircularProgressIndicator를 써서 로딩 뷰를 구현하고 실행했더니 아래 에러가 발생했다. android java.lang.NoSuchMethodError: No virtual method at(Ljava/lang/Object;I)Landroidx/compose/animation/core/KeyframesSpec$KeyframeEntity; in class Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig; or its super classes (declaration of 'androidx.compose.animation.core.KeyframesSpec$KeyframesSpecConfi..
코루틴의 가장 중요한 기능 중 하나는 취소다. 취소는 정말 중요한 기능이라 중단 함수를 쓰는 몇몇 클래스, 라이브러리는 반드시 지원한다. 단순히 쓰레드를 죽이면 연결을 닫고 해제하는 기회가 없어서 최악의 취소 방식이라고 볼 수 있다. 상태가 여전히 Active인지 확인하는 것도 불편하다. 코루틴이 제시하는 방식은 아주 간단하면서 안전하다. 기본적인 취소 Job 인터페이스는 취소하게 하는 cancel()을 가졌다. 이걸 호출하면 아래 효과를 볼 수 있다. 호출한 코루틴은 첫 중단점(아래 코드에선 delay())에서 Job을 끝냄 Job이 자식을 가졌다면 그 자식들도 취소되지만, 부모는 영향받지 않음 Job이 취소되면 Job은 새 코루틴의 부모로 쓰일 수 있음. 취소된 Job은 Cancelling 상태가 됐..
구조화된 동시성의 중요 특징 3개는 Job 컨텍스트와 관련 있다. Job은 코루틴 취소, 상태 파악 등 여러 곳에서 다양하게 쓰일 수 있다. Job이란 Job은 수명을 갖고 있고 취소할 수 있다. Job은 인터페이스지만 구체적 사용법, 상태를 갖고 있어서 추상 클래스처럼 다룰 수 있다. 아래는 Job의 수명을 나타낸 그림이다. Active 상태에선 Job이 실행되고 코루틴은 Job을 수행한다. Job이 코루틴 빌더에 의해 생성됐을 때 코루틴 본체가 실행되는 상태다. 이 때 자식 코루틴을 실행할 수 있고 대부분의 코루틴은 Active 상태로 시작한다. 지연 시작되는 코루틴만 New 상태에서 시작한다. New 상태인 코루틴이 Active 상태가 되려면 작업이 실행돼야 한다. 코루틴이 본체를 실행하면 Acti..
launch의 정의를 보면 첫 파라미터가 coroutineContext인 걸 알 수 있다. public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job 마지막 인자의 리시버도 CoroutineScope다. 이것은 중요한 개념 같으니 시그니처를 확인한다. public interface CoroutineScope { public val coroutineContext: CoroutineContext } @SinceKotlin("1.3") public ..
틈틈이 Compose 공부용으로 뉴스 api를 사용한 뉴스 조회 앱을 만들고 있는데, 뷰모델에 함수를 생성한 후에 액티비티에서 호출하면 ApiResult.Success가 호출되지 않는 현상이 발생했다. 아래는 오류가 발생하던 메인 액티비티의 구현으로, 아직 LazyColumn을 사용하기 전의 코드다. @AndroidEntryPoint class MainActivity : ComponentActivity() { private val newsViewModel: NewsViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ComposeNe..
중단 함수는 Continuation 객체를 다른 중단 함수로 보내야 하기 때문에 아래가 성립한다. 중단 함수는 일반 함수를 호출할 수 있다 일반 함수는 중단 함수를 호출할 수 없다 때문에 모든 중단 함수는 다른 중단 함수에 의해 호출돼야 한다. 그렇다고 일반 함수에서 아예 중단 함수를 호출할 수 없는 건 아니다. 코루틴 빌더를 통해 일반 함수 안에서 중단 함수를 호출할 수 있다. 코루틴 빌더는 3종류 있고 서로 쓰임새가 다르다. launch runBlocking async launch launch의 작동 방식은 thread 함수를 호출해 새로운 쓰레드를 시작하는 것과 같다. import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay imp..
※ 이 포스팅의 내용은 Gson 2.4 이상부터 사용할 수 있다. 2.4 미만의 버전을 사용 중이라면 버전을 올려야 한다 안드로이드에서 서버와 비동기 통신을 수행하려면 보통 레트로핏을 사용한다. 그리고 @SerializedName을 써서 서버에서 받은 값을 역직렬화하고 앱에서 만들어 둔 data class의 변수에 대입해서 사용한다. 그러나 @SerializedName 안에는 특별한 일이 없다면 하나의 문자열만 넣어서, 그 문자열에 해당하는 값을 JSON 문자열에서 가져온다. 이 때 서버에서 내려주는 JSON의 필드가 스네이크 케이스, 카멜 케이스, 파스칼 케이스인 경우에 모두 대응하려면 어떻게 해야 할까? 이 경우가 아니라도 하나의 @SerializedName이 여러 필드명을 알고 있어야 한다면 어떻게..
중단 함수(suspend fun)는 코루틴의 핵심으로, 중단이 가능하다는 건 코루틴의 다른 모든 개념의 기본이 된다. 코루틴은 중단되면 Continuation 객체를 리턴하는데 이 객체를 쓰면 멈췄던 곳에서 코루틴을 재시작할 수 있다. 또한 코루틴을 중단할 때 어떤 자원도 쓰지 않으며 다른 쓰레드에서 시작하거나 (역)직렬화할 수 있다. 재개 재개에는 당연히 코루틴이 필요하다. 이것은 안드로이드 디벨로퍼에도 작성되어 있으며 해당 링크는 하단의 재개 부분에 첨부했다. 중단 함수는 반드시 코루틴 or 다른 중단 함수에 의해 호출돼야 한다. 코루틴은 runBlocking, launch 같은 코루틴 빌더를 써서 만들 수 있다. suspend fun main() { println("before") println("..
파이썬, 자바스크립트 등 언어에선 제한된 형태의 코루틴을 쓰고 있다. 비동기 함수(async, await) 제너레이터 함수(값을 순차적으로 리턴하는 함수) 코틀린에는 제너레이터 대신 시퀀스를 생성할 때 사용하는 시퀀스 빌더가 있다. 시퀀스는 List, Set 같은 컬렉션과 비슷한 개념이지만 필요할 때마다 값을 하나씩 계산하는 지연 처리를 한다. 시퀀스의 특징은 아래와 같다. 요구되는 연산을 최소한으로 수행 무한정이 될 수 있음 메모리 사용이 효율적 (이펙티브 코틀린 아이템 49 참고) 이런 특징 때문에 값을 순차 계산해서 필요할 때 리턴하는 빌더를 정의하는 게 좋다. 시퀀스는 sequence 함수로 정의하며 람다식 안에선 yield 함수를 호출해 시퀀스의 다음 값을 생성한다. val seq = seque..