본문 바로가기

Android8

[Android] 앱 삭제 후 재설치해도 데이터가 남아있는 문제 앱을 삭제 후 재설치해도 삭제 전에 저장되어 있던 데이터가 남아있는 경우가 있다. Android 6.0(API 수준 23) 이상을 타겟팅하는 앱은 자동으로 자동 백업을 하게 되는데, AndroidManifest.xml 파일의 application에 android:allowBackup 속성을 따로 설정하지 않으면 자동으로 true로 설정된다. 이로 인해 사용자도 모르게 데이터가 구글 클라우드에 자동으로 백업된다. 자동 백업을 중지하려면? AndroidManifest.xml 파일에서 application 요소에 아래 두 속성을 추가한다. android:allowBackup="true" // 백업을 사용 중지한다. android:fullBackupContent="false" // 백업 규칙을 포함하는 XML .. 2022. 1. 19.
[Kotlin] Collections(List, Set, Map) Collection(콜렉션)은 대부분의 프로그래밍 언어에 있는 자료구조이다. 코틀린의 Collection(List, Set, Map)을 살펴보자. Collection Types 코틀린의 Collection은 기본적으로 Mutable(변할 수 없는)과 Immutable(불변의)을 별개로 지원한다. Mutable로 생성하면 추가, 삭제가 가능하지만, Immutable로 생성하면 수정이 불가하다. Immutable (불변) Read-Only 읽기 전용 Collection (수정, 추가, 삭제 불가) Mutable (가변) Write+Read 읽기/쓰기 Collection으로 add, put, remove 등이 가능 코틀린의 콜렉션들은 아래 그림과 같은 상속 구조 갖고 있다. List List는 데이터가 저장하.. 2021. 10. 24.
[Kotlin] 코틀린 null 처리 - Safe call, non-null, Elvis operator 코틀린에서는 자바보다 null 처리를 좀 더 명확하게 한다. 코틀린은 기본적으로 값이 notNull로 nullable 표현에만 ?가 사용된다. 따라서 NPE(NullPointerException)가 발생하는 빈도를 현저히 낮출 수 있다. Nullable types 변수 타입 옆에 물음표(?)를 붙임으로서 null이 가능한 변수임을 명시적으로 표현할 수 있다. val str: String? = null Safe call operator null을 안전하게 처리하기 위해 코틀린은 ?. 연산자를 지원한다. val str: String? = null val upperCase = str?.toUpperCase() // null ?. 연산자를 사용하면, 앞의 변수가 null이 아닐때만 오른쪽 함수가 수행되고 nul.. 2021. 10. 24.
[Android] RecyclerView DiffUtil RecyclerView에 표현할 데이터를 업데이트하기 위해 주로 notifyDataSetChanged()를 호출한다. notifyDataSetChanged() 리스트의 내용이 변경되어 notifyDataSetChanged()를 호출하면, Adapter에게 RecyclerView의 데이터가 바뀌었으니 모든 항목을 통째로 업데이트를 하라는 신호를 보낸다. 이 방법은 모든 데이터를 다시 그리기 때문에 업데이트 과정이 지연되어 UX에 영향을 미칠 가능성이 매우 크다. 우리는 리스트를 매일 보고 사용한다. 변경이 된 데이터에 대해서만 Adapter 업데이트를 할 필요가 있는데 이를 위해 고안된 것이 DiffUtil 클래스다. DiffUtil을 이용하여 데이터를 효율적으로 업데이트 할 수 있다. DiffUtil R.. 2021. 9. 16.
[Kotlin] Extension Function(확장 함수) Kotlin Extension Function 클래스를 확장하면서 만든 새로운 함수를 확장 함수(extension function)라고 한다. Kotlin Extension Function은 클래스를 상속하거나 어떤 유형의 디자인 패턴을 사용하지 않고도 클래스를 확장하는 기능을 제공한다. • Receiver type : 확장 함수를 추가할 클래스를 말한다. 즉, 확장 대상이 될 클래스이다. • Receiver object : 확장 함수 내부를 구현할 때 this로 receiver type이 가지고 있는 public 인스턴스에 접근할 수 있다. 이렇게 접근한 객체를 receiver object 라고 부른다. 기본 구조는, 아래와 같이 확장할 클래스명 뒤에 원하는 함수명을 붙여주기만 하면 된다. fun .(.. 2021. 9. 7.
[Kotlin] Higher-Order Function, Lambda(고차 함수와 람다) Higher-Order Function 고차 함수(Higher-Order Function)는 Functional Programming을 할 때 많이 사용한다. 아래 중 하나 이상을 만족하면 고차 함수로 볼 수 있다. • 함수를 인자로 받는다. • 함수를 결과로 반환한다. Java 8 ver.에서 람다를 발표하기 이전에는 함수를 매개변수로 전달하기 위해 해당 함수가 선언된 인터페이스를 구현한 클래스를 정의하고 객체를 생성하여 그 객체를 매개변수로 전달하는 방법을 주로 사용했다. Java에서 많이 봤던 setOnclickListner 같은 콜백 함수가 고차 함수에 속한다. button.setOnClickListener(new View.OnClickListener() { @Override public void.. 2021. 9. 7.
[Android] Databinding error : cannot find symbol ActivityBindingImpl error: cannot find symbol 1. Build > Clean Project 2. Build > Rebuild Project 3. File > Invalidate Caches/Restart... > Invalidate Caches and Restart 개발 중, 불필요한 캐싱 파일이나 오류를 생성할 수 있다. 갑작스러운 빌드 에러가 뜬다면, 안드로이드 클리닝 명령 3종 세트를 실행해 보자. 2021. 9. 3.
[Android] Hilt @ViewModelInject is Deprecated @HiltViewModel class MainViewModel @Inject constructor( private val repository: Repository ): ViewModel() { // Some code } Hilt의 @ViewModelInject deprecated 문제 -> @Inject로 변경 후 @HiltViewModel 를 추가하여 해결 2021. 8. 30.