분류 전체보기

    RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{dcc7ca6 u0 com.***.***/.ble.BleService}

    RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{dcc7ca6 u0 com.***.***/.ble.BleService}

    원인 서비스에서 startForeground 호출 시점이 꼬이면 발생하는 예외 해결 onStartCommand() 에서 호출하던 startFroeground를 onCreate() 로 변경 private fun createNotificationChannel() { ... startForeground(NOTIFICATION_ID, notification) } broadcastUpdate(BleObject.START_FOREGROUND_SERVICE, "startForegroundService") } override fun onCreate() { super.onCreate() createNotificationChannel() } override fun onStartCommand(intent: Intent?, ..

    달리기 경주

    달리기 경주

    프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다 선수들의 이름이 1등부터 현재 등수 순서대로 담긴 분자열 배열 players와 해설진이 부른 이름을 담..

    --- Failed to create image decoder with message 'unimplemented'

    --- Failed to create image decoder with message 'unimplemented'

    원인 Glide SVG이미지 로드 시 발생하는 에러, 버전에 따라 앱이 다운되는 경우도 있다. Glide.with(requireContext()).load(R.drawable.ic_sunny).into(binding.weatherIv) 해결 drawable 정수값 대신 ContextCompat.getDrawable로 호출 fun setImage(drawable: Int){ val image = ContextCompat.getDrawable(requireContext(), drawable) as VectorDrawable Glide.with(requireContext()).load(image).into(binding.weatherIv) } 참고 안드로이드 Glide SVG 이미지 로드 관련 오류 해결 - ..

    Caused by: java.lang.IllegalArgumentException: Char / is not a decimal digit

    Caused by: java.lang.IllegalArgumentException: Char / is not a decimal digit

    원인 StringBuilder에서 get한 값을 바로 digitToInt 했을 때 나온 에러입니다. if(sb[1].digitToInt() == 9) 해결 String -> Int 로 String을 한 번 거쳐줬습니다. if(sb[1].toString().toInt() == 9)

    봉인된 클래스 및 인터페이스(Seald Class & Interface)

    봉인된 클래스 및 인터페이스(Seald Class & Interface)

    봉인된 클래스(Seald Class) 코틀린에서 enum과 함께 두 번째로 잘 사용하지 않는 기능을 한 번 정리해보려고 합니다. 비록 장점과 정의 부분에 있어서 미숙한 부분이 있지만 이해해 주길 바랍니다. 들어가기 전 항상 이런 개념적인 내용을 볼 때 드는 생각은 왜 써야 하는가?이다. 왜? 어디에? 언제? SealedClass의 장점은 when절을 쓸 때 else구문을 사용할 필요가 없다. when절이 값을 반환해야 한다면 else문이 없을 경우 컴파일 에러가 날 수 있다. 하지만 조건분기들을 SealedClass에 넣어놓는다면 컴파일이 가능하다. 이게 장점?이라고 반문할 수 있지만 생각보다 큰 장점이다. 조건 분기에서 else문을 지운다는 의미는 내가 원한 조건 이외의 것을 고려할 필요가 없다는 뜻이..

    Navigation으로 Fragment전환을 쉽게 해보자 (feat.BottomNavigation)

    Navigation으로 Fragment전환을 쉽게 해보자 (feat.BottomNavigation)

    Fragment는 생각만 하면 머리가 아파오지만 안드로이드의 필수적인 기능임은 틀림없습니다. 하지만 화면 전환을 할 때만 되면 골치 아파지죠, 특히 프래그먼트간 전환을 할 때입니다. 기존 액티비티에서 프래그먼트로 이동할 때 FragmentManager()를 이용했습니다. 그리고 프래그먼트 간 전환을 하기 위해 우린 상위 액티비티에서 전환 이벤트를 전부 구현해줘야 했습니다. Activity to Fragment, Fragment to Fragment Fragment란? 사전적 의미로 Fragment란 조각을 의미한다. 우리가 앱을 개발하다보면 액티비티에 부분적인 화면을 추가하고 싶을 때가 있다. 특히, 한 액티비티에서 여러 화면이 전환되게 만들고 싶을 huzit.tistory.com 이런 불편하고 까다로운..

    플로우 차트(Flow Chart)

    플로우 차트(Flow Chart)

    회사에 들어가거나 팀 프로젝트를 하면 기획 단계에서 플로우 차트를 그려보란 말을 많이 들을 수 있습니다. 개발자가 개발만 하면 되지 그림까지 그릴 필요 있나? 하실 수 있지만 플로우 차트와 다양한 자료들을 기반으로 메뉴 설계와 화면 구성을 하기 때문에 직접 그리지 않아도 볼 줄 알아야 합니다. 또한 개인 프로젝트를 하시거나 토이 프로젝트를 할 때 순서도를 미리 그려놓고 작업하게 되면 개발 중 헤매는 일이 잘 없습니다. 헤매면 웃음밖에 안나오죠 개념 순서도(flow chart)는 워크플로 혹은 프로세스를 보여주는 다이어 그램의 한 종류입니다. 여러 종류의 상자와 이를 이어주는 화살표를 이용해 주어진 문제에 대한 솔루션 모델을 보여줍니다. 프로세스 작용은 이 같은 상자들과 작업의 흐름(workflow)을 나..

    RecyclerView의 notifyItem메서드들의 문제점을 해결해보자! 3탄(ListAdapter)

    드디어 마지막 단계까지 왔습니다. 앞에서 DiffUtil과 AsyncListDiffer에 대해 알아본 것은 ListAdapter을 사용하기 위함이었다고 할 정도로 앞의 내용을 모두 포함하고 있는 주제입니다. 입사 한 직후 안드로이드를 다시 시작해서 처음 들었던 주제를 드디어 다 정리하네요. 만약 AsyncListDiffer를 모르신다면 보고 오시는 거 추천드립니다. 이해하는데 100% 도움을 줍니다. RecyclerView의 notifyItem메서드들의 문제점을 해결해보자! 2탄(AsyncListDiffer) 지난 시간엔 DiffUtil을 이용해서 문제점을 해결했다면 이번 시간엔 AsyncListDiffer을 이용해서 문제를 해결해 보겠습니다. 이번 포스팅을 보고 나면 ListAdapter을 이해하는데..