분류 전체보기 58

No adapter attached; skipping layout 발생 이유

이 에러는 RecyclerView가 화면에 레이아웃을 그리려는 시점에 아직 Adapter가 설정되지 않았기 때문에 발생합니다.대부분 api 응답하는 부분안에 recyclerView.adapter = myAdapter 를 넣거나라이브데이터 옵저버 타는 부분에 recyclerView.adapter = myAdapter 를 넣어서 오류가 발생합니다. 심지어 클릭리스너에도 넣는 경우도 있습니다. 이건 리사이클러뷰를 생성하고 아답터 초기화를 나중에 해서 발생합니다. 옵저버타는 부분에 넣는 경우 최악의 경우옵저버에 데이터를 넣지 않으면 평생 아답터 초기화는 이뤄지지 않습니다. 명심할것! 리사이클러뷰는 onCreate()에 호출할때 아답터도 같이 초기화하는것을 머릿속에 넣으세요. 주요 원인: Adapter ..

클로드 코드 사용시 인증 만료 오류 발생할경우

너무 공포스럽지 아니한가?업무가 바쁜데 이거라니.당황하지 말자. 솟아날 구멍은 있다. API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"OAuth token has expired. Please obtain a new token or refresh your existing token."},"request_id":"req_011CWDDEAbYhKJyrKdeYdfd"} · Please run /login 발생원인Claude Code는 로그인하면 OAuth 토큰을 발급받아 ~/.claude 폴더에 저장한다.. 이 토큰은 일정 시간(보통 몇 시간~며칠)이 지나면 만료된다. 우선 (케이스1)1.터미널 실행해서 아..

AI도구 2025.12.18

상태바,하단의 소프트키 가려지는 현상 해결하기

액티비티의 onCreate() 레이아웃호출 위에 삽입 // 상태바 아이콘을 밝게(흰색) 변경 WindowCompat.setDecorFitsSystemWindows(getWindow(), false); getWindow().setStatusBarColor(getResources().getColor(R.color.gray));//본인이 설정 // 상태바 아이콘을 밝게(흰색) 변경 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowInsetsController insetsController = getWindow().getDecorView().getWindowInsetsControl..

AGP와 Gradle 버전 맞추기

AGP,Gradle 버전만 잘 맞추는 방법은 아래에 자세히 설명되어 있지만 눈에 잘 와닿지 않는다. https://developer.android.com/build/releases/gradle-plugin?hl=ko#updating-gradle사이트에 가면 아래 2가지의 표가 있다. 1.Gradle 업데이트 2.Android Gradle 플러그인과 Android 스튜디오 호환성 우선 내가 만족스럽게 사용하는 Koala를 예로 들겠다. 나는 koala와 Narwhal 버전에서 사용하고 싶다.이럴경우 AGP와 Gradle 버전만 알아내면 끝이다. 1단계 ) AGP 버전 찾기 [ Android Gradle 플러그인과 Android 스튜디오 호환성 ]표를 보고 사용하고자 하는 안드로이드스튜디오 이름에..

반드시 CoroutineScope를 직접 써야 하는 예시 (공식문서 기반)

상황 lifecycleScope/viewModelScope 사용 불가 이유 반드시 CoroutineScope 직접 써야 하는 이유1. Repository 등 "ViewModel이 아닌" 객체lifecycleScope/viewModelScope는 Activity, ViewModel에만 있음자체적으로 스코프 관리 필요2. 라이브러리 개발 (외부에 의존성 없이)앱 구조에 종속되면 안 됨독립적으로 코루틴 관리 필요3. 백그라운드 서비스/포그라운드 서비스Service에는 lifecycl..

코루틴 스코프 쉽게 외우기

코루틴 스코프 종류도 많고 역할도 각기 다르고 헷갈립니다.쉽게 외우는 방법을 공유합니다. 아래처럼 “L → V → G” 순으로 떠올리면 기억하기 쉽습니다.L: lifecycleScope소유자: Activity/Fragment용도: UI 관련 작업 → UI가 살아 있는 동안만 실행기억법: Lifecycle → Life(생명)V: viewModelScope소유자: ViewModel용도: 비즈니스 로직(네트워크·DB) → ViewModel이 살아 있는 동안 실행기억법: ViewModel → View(화면 뒤 로직)G: GlobalScope소유자: 앱 전체(Application)용도: 전역 작업(앱 프로세스 전체) → 수동 취소 필요기억법: Global(전역) Scope ..

커스텀 스피너의 dropdown 창 닫기

Spinner 자체가 강제적으로 dropdown 을 닫는 기능을 고려해서 만들지 않았다. 기본적으로 스피너의 아이템 클릭하면 바로 dropdown 이 닫히기때문이다. 그래도 억지로 커스텀 스피너를 만들어 버튼을 이용해 dropdown을 닫고자 한다면 이 방법이 가장 간단하다 binding.btnAction.setOnClickListener { val parentView = parent as? AdapterView parentView?.performItemClick(binding.root, position, getItemId(position)) }

비콘스캐닝 및 모의위치 주입 관련 앱을 만들때 주의사항

✅ 백그라운드 최적화 핵심 체크리스트Foreground Service 필수: - 항상 startForeground() 호출, 알림 고정 - 절대 일반 Service로 실행하지 말 것서비스 분리: - “계속 살아 있어야 하는 비콘 감지(BeaconService)”는 Foreground - “일회성 작업(모의위치 주입)”은 짧게 실행 후 stopSelf()로 종료메모리 릭/과다 WakeUp 방지: - CoroutineScope(Dispatchers.Default)로 주기 작업 - 주기 체크(예: 2초) 외 불필요한 Timer, Handler, Alarm 사용 XDoze 모드/절전 예외 적용: - Foreground Service는 일반 절전 모드에서 살아남지만, - Doze 모드 심화(충전+화면 꺼짐)에서는..