다음과 같은 두 개의 List를 각각 인덱스 순서대로 짝을 맞추어 Map으로 변환하려 한다. zip() : 두 개의 리스트를 쌍으로 묶어준다. toMap() : Map으로 변환한다. val map = name.zip(yearning.toTypedArray()).toMap()
System 상에서 현재 애플리케이션을 완전히 종료시키는 로직 fun killApp(activity: Activity) { ActivityCompat.finishAffinity(activity) exitProcess(0) } 1. ActivityCompat.finishAffinity(activity) : 주어진 Activity와 해당 Activity 위에 쌓인 모든 Activity를 종료 2. exitProcess(0) : 현재 프로세스를 종료. 0은 정상 종료를 의미하는 코드 값
아래와 같이 api 호출 인터페이스를 구성하여 서버와의 통신을 시도했는데, EOFException이 발생했다. interface TestApi { @PUT("/api/test") fun update( @HeaderMap headers: HashMap, @Body request: BodyRequest ): Call } java.io.EOFException: End of input at line 1 column 1 path 통신 후, Response를 반환하는데 Empty Response를 반환하고 있었다. 하지만 내가 작업하면서 NormalResponse Type으로 반환되도록 구성하면서 발생하는 것이 원인이었다. 이 경우 2가지 해결 방법이 존재했다. 1. NormalResponse가 아니라 Unit으로..
제일 상위에 있는 차원의 배열을 해제해 준다. List 형태로 반환되며, 모든 중첩 배열을 해제해 주기 위해 n 차원만큼 flatten() 처리해주어야 한다. fun main() { val arr = arrayOf(arrayOf(1,2,3), arrayOf(7,8,9), arrayOf(arrayOf(100, 101, 102), arrayOf(201, 202, 203))) println(arr.contentDeepToString()) val arr2 = arr.flatten() println(arr2.toString()) }
사용자의 앱이 최신 버전인지를 판단하여 필요에 따라 플레이스토어에서 업데이트를 요구할 수 있는 로직이 필요했다. 마침 Android에서 제공하는 AppUpdateManagerFactory가 존재했다. https://developer.android.com/reference/com/google/android/play/core/appupdate/AppUpdateManagerFactory AppUpdateManagerFactory | Android Developers Stay organized with collections Save and categorize content based on your preferences. AppUpdateManagerFactory public final class AppUpdat..
사용자의 디바이스를 식별하거나 정보 파악을 위해서 id 또는 기기명, OS 버전 등의 확인이 필요한 경우가 있다. 이러한 정보를 Build Class에서 가져올 수 있다. GPT를 통해 확인한 Build Class에 담긴 정보는 아래와 같다. 1. Build.VERSION: Android 운영 체제의 버전 정보를 제공합니다. 예를 들어, Build.VERSION.SDK_INT를 통해 API 레벨(안드로이드 버전 코드)을 얻을 수 있습니다. 2. Build.VERSION_CODES: Android API 레벨을 상수로 정의한 클래스입니다. 코드에서 각 버전에 대한 조건을 확인할 때 사용됩니다. 3. Build.MODEL: 기기의 모델 이름을 제공합니다. 4. Build.MANUFACTURER: 제조사 정보..
Crashlytics 살피던 중, 아래와 같은 Error Report를 발견했다. Fatal Exception: java.lang.IllegalArgumentException: View=DecorView@b5f5db7[TestActivity] not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:657) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:564) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.j..
사용자에게 좀 더 신속한 데이터 갱신 처리를 제공하기 위해 백그라운드 동기화 처리를 구현하기로 했다. Jetpack에서 지원하는 WorkManager를 사용해 보기로 했다. 먼저 build.gradle에 다음 설정을 추가해준다. implementation "androidx.work:work-runtime-ktx:2.8.1" 그리고 작업 정의를 위한 Worker 클래스를 생성한다. class SyncWorker(val context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { syncAndCallApi() return Result.success() } } doWork 내에서 비동기..
사용자가 프로필 사진을 변경하기 위해 갤러리에서 사진을 선택해 가져오는 로직이 노후화되어 전체적으로 재구성했다. registerForActivityResult를 활용했다. https://developer.android.com/training/basics/intents/result?hl=ko 활동에서 결과 가져오기 | Android 개발자 | Android Developers 활동에서 결과 가져오기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 앱 내에서든 다른 앱에서든 다른 활동을 시작하는 것은 단방향 작업이 아니어도 됩 developer.android.com 먼저 갤러리로 진입할 수 있는 로직을 작성한다. val permissions = if (Build.VERSION...
Android에서 비동기 처리를 위해 많이 사용되던 AsyncTask가 deprecated 되었는데, 프로젝트에 아직도 사용되는 부분들이 존재하여 Coroutine을 활용하여 비동기 처리하도록 수정을 진행했다. public class CheckApiTask extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); //Task 실행 전 UI 작업 } @Override protected Boolean doInBackground(String[] params) { try { //Background 작업 } catch (Exception e) { e.printStackTrace(); } return false; } @Ov..