분류 전체보기 426

[Android] CoroutineScope, CoroutineContext, CoroutineBuilder, suspend Function

#CoroutineScope 코루틴이 실행되는 범위로, 코루틴을 실행하고 싶은 Lifecycle에 따라 원하는 Scope를 생성하여 코루틴이 실행될 작업 범위를 지정할 수 있습니다. 사용자 지정 CoroutineScope: CoroutineScope(CorountineContext) ex) CoroutineScope(Dispatchers.Main) // Dispatchers.Main, Dispatchers.Default, Dispatchers.IO, Job()... // 메인 쓰레드에서 실행될 사용자 정의 Scope val scope = CoroutineScope(Dispatchers.Main) scope.launch { // 메인 쓰레드 작업 } // 백그라운드에서 실행될 사용자 정의 Scope Cor..

[Android] Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3

Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3 StateFlow와 SharedFlow는 흐름에서 최적으로 상태 업데이트를 내보내고 여러 소비자에게 값을 내보낼 수 있는 Flow API입니다. # StateFlow 현재 상태와 새로운 상태 업데이트를 수집기에 내보내는 관찰 가능한 상태 홀더 흐름입니다. value속성을 통해서도 현재 상태 값을 읽을 수 있습니다. 상태를 업데이트하고 흐름에 전송하려면 MutableStateFlow 클래스의 value 속성에 새 값을 할당합니다. private val _uiState = MutableStateFlow(LatestNewsUiState.Success(emptyList())..

[Android] DiffUtil에 대해 알아보자

Android DiffUtil 리싸이클러뷰 아이템 구성이 바뀔때, notifyDataSetChanged()로 모든 아이템을 업데이트 하는 방법을 사용해 왔다. 하지만 이 방법은 아이템 개수가 많아질수록 비효율적일 수 밖에 없다. 이런 문제를 알고 구글에서는 DiffUtil이라는 매우 편리한 유틸리티 클래스를 만들었다. 두 리스트의 차이점을 찾아 업데이트 되어야 할 목록을 반환 해 줘서 RecyclerView어댑터에 업데이트를 알리는데 사용 DiffUtil 사용하기 먼저 DiffUtil.Callback을 구현한 클래스를 만들어야 한다. class PersonDiffCallback( private val oldList: List, private val newList: List ) : DiffUtil.Call..

안드로이드 2024.03.20

[Android] MediaStore에서 미디어 파일 정보 읽는 방법

MediaStore에서 미디어 파일 정보 읽는 방법 Media Provider와 MediaStore라는 용어에 대해 알아야 한다. Media Provider 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더 입니다. 이 프로바이더에게 찾고 싶은 종류의 데이터를 쿼리할 수 있습니다. Media Store 앱이 Media Provider가 제공하는 파일들을 접근할 수 있도록 도와주는 API들의 묶음입니다. 쿼리에 필요한 데이터들이 정의되어 있습니다. 따라서, 우리는 MediaStore의 API들이 어떤 의미인지 이해하고, 그 API를 통해 Media Provider에 쿼리를 하여 데이터를 얻으면 됩니다. Android 10(Q)이상 Scoped Storage 부분은 다루지 않겠습니다...

안드로이드 2024.03.20

Android Q 파일 삭제 ScopeStorage 삽질

이미지를 서버에 업로드후에 삭제해야 하는 이슈. * 이미지를 업로드 후에 다른 Task(runnable)에서 파일을 삭제 시켜주는 로직이 들어가 있음.(해당 액티비티에서 삭제가 아님) 나의 삽질을 적어둔 것 하단에 결론만 보셔도 됩니다. 1. SAF로 Uri를 가져옴. : content://com.android.providers.media.documents/document/image%3A328 2. DocumentsContract.deleteDocument를 이용해 삭제 시도. - 실패 : NullPointerException: authority 익셉션 떨어짐. 처음에 가져온 경로를 File(path)하여 삭제 중 이었음. (content:// Uri였기 때문에 경로가 바뀐듯.) 바뀐 경로 : /cont..

안드로이드 2024.03.20

[Android] Gson으로 데이터를 가져오지 못할 때 (코드 난독화)

Gson라이브러리를 이용하여 데이터를 가져왔는데 코드 난독화를 하면 에러가 발생하면서 앱이 종료 되었다. java.lang.NullPointerException: throw with null exception at package.Response$b.hashCode(Unknown Source:3) 1) 해당 data쪽 모델을 keep class로 난독화 해제를 해주었지만 에러남 2) 찾아보니 gson.fromJson이 일을 제대로 하고 있지 않다고 한다. 해결방법 1) gradle.properties파일을 열고 android.enableR8=false 2) proguard-rules.pro 파일에 R8 방지 코드를 추가. -keepclassmembers,allowobfuscation class * { @c..

트레블월렛(Travel Wallet), 트레블페이 사용 방법

트레블월렛 Travel Wallet 이란? 트레블월렛(Travel Wallet)은 해외 결제 관련 어플로 해당 어플을 통해 트레블페이를 사용할 수 있다. 트레블페이? 어플을 이용하여 카드에 15개 외화를 미리 충전하고 충전된 외화로 수수료 없이 해외 결제하는 외화 충전 / 결제 서비스이다. 선불식 충전카드라고 생각 하면 됩니다. 장점? 연회비 무료 해외 현지 결제 수수료 무료 현지 ATM 출금 가능 카드 하나에 15개 외화 충전 가능 실시간 환율로 외화 충전 현지 비자 가맹점 카드 결제 가능 해외 직구 결제 수수료 무료 카드 분실 시 앱에서 바로 비활성화 가능 교통카드 사용 가능 (단, 사용가능한 국가와 도시가 정해져 있음) 카드 발급 방법 1. 트레블월렛 앱 설치 2. 앱에서 은행 계좌 등록 3. 모바..

여행 2024.03.19

[Kotlin] 코틀린이란 무엇이며, 왜 필요한가?

코틀린이란? 자바 플랫폼에서 돌아가는 프로그래밍 언어 자바와의 상호운용성에 초점을 맞춘 실용적이고 간결하며 안전한 언어 대상 플랫폼 서버 (backend) 안드로이드 모바일 애플리케이션 등등 (iOS, 자바스크립트…) 코틀린은 정적 타입(statically typed) 지정 언어 정적 타입 지정 언어? : 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고, 필드나 메소드 사용 시 컴파일러가 타입을 검증해준다. 동적 타입 지정 언어? : 타입 관계없이 모든 값을 변수에 넣을 수 있고, 실행 시점에 필드나 메소드에 대한 검증한다. (Groovy, JRuby 등) 정적 타입 지정 언어 장점 성능 : 컴파일 시점에 메소드 호출 여부를 알고 있어서 빠르다. 신뢰성 : 컴파일러가 컴파일 시점에 프로그램의 정확..

[Android] FCM을 사용해서 메시지를 보내는 과정 (FCM 추가)

FCM을 사용해서 메시지를 보내는 과정 1. 토큰 요청 및 획득 먼저 사용자가 앱을 설치하고 최초 실행시 토큰을 얻기위해 클라우드 서버에 요청을 보내고 토큰을 획득 2. 서버에 토큰 저장 획득한 토큰을 서버로 전송하여 서버 db에 저장 3. 토큰을 이용해 메시지 전송 요청 서버에서 클라우드로 메시지 데이터와 함께 토큰을 보내 전송을 요청 4. 메시지 전송 클라우드는 요청 받은 메시지를 토큰에 해당하는 단말기에 전송 5. 리스너를 통해 메시지 수신 앱이 실행중이 아니더라도 리스너를 통해 메시지를 수신할 수 있다. 프로젝트 설정 1. 구글 firebase console접속 2. 안드로이드 프로젝트 생성 후 google-service.json을 다운 받아 앱 모듈 루트 디렉토리에 넣는다. 안드로이드 스튜디오 ..

안드로이드 2024.03.19

[Kotlin] 기본 요소 함수와 변수에 대해 알아보자 (1)

코틀린에서 타입 선언을 생략해도 된다. # 코틀린 특징 코틀린 표준 라이브러리는 여러가지 표준 자바 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼(wrapper)를 제공 줄 끝에 세미콜론(;)을 붙이지 않아도 된다. if는(값을 만들어내지 못하는 문장이 아니고 결과를 만드는 식) 문(statement)과 식(expression) 식은 값을 만들어 내며 다른 식의 하위 요소로 계산에 참여할 수 있다. 문은 가장 안쪽 블록의 최상위 요소로 존재, 아무런 값을 만들어내지 않는다. 코틀린은 루프를 제외한 대부분의 제어 구조가 식이다 자바는 모든 제어 구조가 문이다 반면 대입문은 자바에서는 식이었으나, 코틀린에서는 문이 됐다. # 함수 fun max(a: Int, b: Int): Int { } 함수를 선언..