분류 전체보기 54

[안드로이드] 코루틴 - Scope, Dispacher

💡 코루틴 스코프 ? - 코루틴은 코루틴 스코프 안에서만 동작한다. GlobalScope application이 시작하고 종료될 때까지 계속 유지된다. 싱글톤으로 따로 생성하지 않아도 어디에서든 바로 접근 가능하다. 특정 activity 나 service에서 잠깐 사용하는 것이라면 사용을 안한다. LifecycleScope 해당 라이프사이클 소유자의 생명주기와 연계되어있다. destroyed될 때 자동으로 스코프가 취소된다. ViewModelScope 뷰모델에 연결된 스코프로 뷰모델이 지워지면 취소된다. runBlocking runBlocking에 넘겨준 코루틴 로직을 모두 수행 할 때까지 기다린다. 💡 코루틴 dispatcher ? Dispatchers.IO 코루틴은 공유된 스레드 풀로에 있는 백스라운..

안드로이드 2022.10.12

[코틀린] Paging3

💡 Paging ? 시스템 리소스를 효율적으로 활용하기 위해서 일정한 페이지 사이즈 만큼 나눠서 데이터를 로딩하는 기능. 1. PagingSource 구현 - pagingSource : 키는 데이터를 로드하는데 사용되는 식별자, 값은 데이터 자체의 유형 - load() : params.key로 다음 페이지 값 전달 - LoadResult : 로드 작업에 대한 결과 class TicketPagingSource( private val category: String?, private val sort: Array, private val service: TicketApiService ) : PagingSource() { override fun getRefreshKey(state: PagingState): Int?..

안드로이드 2022.10.10

[안드로이드] Activity vs Fragment 차이

💡 Activity? - 앱과 사용자의 상호작용을 위한 진입점 역할과 동시에 ui화면을 그리는 컨테이너 역할. Activity 생명주기 - oncreate() : 필수적이며 시스템이 acitivity를 생성할 때 실행. 주로 데이터를 바인딩하거나 뷰모델을 연결. - onstart() : activity 가 사용자에게 표시되는 단계이며 activity를 포그라운드에 보내 사용자와 상호작용할 준비. - onresume() : activity는 포그라운드에 표시되며 앱이 사용자와 상호작용. 💡 Fragment? - 독립적으로 존재할 수 있으며 activity에 종속되어 있다. 다양항 ui를 모듈화하여 재사용하고 화면 구성을 더욱 쉽게 할 수 있음. Fragment 생명주기 - CREATED : 이미 onatt..

안드로이드 2022.10.09

[안드로이드] ViewBinding 사용시 주의점

ViewBinding은 xml를 자동으로 바인딩 클래스로 생성해서 xml의 view를 사용할 수 있다. ❗️ Fragment는 onCreateView에서 view를 생성하기 때문에 lifecycle이 2개 존재. - 기본적으로 fragment는 fragment view 보다 lifecycle이 길다. - 그래서 onDestroyView() 함수에서 직접 binding객체를 null로 만들어야 메모리 누수를 방지할 수 있다. private var _binding: FragmentTicketCategoryBinding? = null val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: View..

안드로이드 2022.10.07

[코틀린] Coroutine Flow 개념 정리

💡 Flow 는 비동기식으로 계산할 수 있는 데이터 스트림으로 여러 값을 순차적으로 내보낼 수 있다. - 생산자 : 스트림에 추가되는 데이터 생산 - 중개자 : 스트림에 내보내는 값이나 스트림을 수정 - 소비자 : 스트림 값을 사용 1. Flow 생성 flow { } 로 생성 가능 데이터 전달을 위해서 emit() 함수를 사용하고 emitAll() 를 통해 다른 데이터도 방출 가능 asFlow()를 이용하면 array, iterator, range등도 flow로 변환 가능. private fun getNumbers(): Flow = flow { for (i in 1..100) { emit(i) println("Emit $i") // 1 ~ 100 까지 방출 } emitAll((101 .. 200).asF..

안드로이드 2022.10.06

[안드로이드] LiveData vs Flow 차이점

mvvm 패턴을 설계할 때 viewmodel에서 사용되는 관찰 가능한 데이터로써 ACC에서 제공하는 livedata를 사용. 이때, 코루틴에서 지원하는 flow가 존재한다. 💡 LiveData ? - 관찰가능한 데이터 타입으로 ACC의 viewmodel이나 databinding과 호환되어 mvvm패턴을 구현할 때 사용된다. - retrofit 이나 room에서도 지원하기 때문에 data layer에서 사용 가능. 장점 안드로이드의 수명주기를 인식 ui를 갱신하면 메모리 누수가 없고 앱이 튕기는 일 방지 가능. 단점 비동기 데이터 스트림 지원하지 않음( main thread에서만 관찰 됨) data layer, domain layer 에서 사용하기 부적합 -> work thread에서 처리해야 성능이 유리..

안드로이드 2022.10.05

[안드로이드] 안드로이드 DialogFragment() 화면 사이즈 조정

DialogFragment를 상속받아 팝업창 형태의 다이얼로그를 띄울 때 의도한 사이즈와 다르게 레이아웃이 나올 수 있다. 1. Value 패키지 안에 dimens.xml 파일을 하나 생성한다. - 다음과 같이 설정하고 싶은 사이즈를 부르고 싶은 name과 함께 작성한다. 316dp 204dp 2. DialogFragment를 상속받은 fragment 안에서 다음 코드를 작성한다. private fun setLayout() { requireNotNull(dialog).apply { requireNotNull(window).apply { setLayout( resources.getDimensionPixelSize(R.dimen.dialogWidth), resources.getDimensionPixelSiz..

안드로이드 2022.10.04

[코틀린] 코틀린 - 고차함수

💡 함수형 프로그래밍? 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 💡 고차함수? 함수를 인수로 취급하거나 혹은 결과로 반환하는 함수 💡 람다? 함수가 이름을 가질 필요 없는 익명함수이며 중괄호로 묶어 사용 // 람다 함수 val sum : (Int,Int) -> Int = {x,y -> x+y} (타입, 타입) -> 반환형 타입 val sum = {x: Int, y: Int -> x+y} // 고차함수 fun calculator(a :Int, b: Int, p: (Int,Int) -> Int) { println("$a, $b -> ${p(a,b)}") } //호출 calculator(2,4, {a: Int, b: Int -> a+b}) //..

안드로이드 2022.10.03

[코틀린] 코틀린 - 빌더패턴(Builder pattern)

💡 빌더 패턴? - 복합객체의 구성요소를 포함한 별도의 클래스를 만들고 이 클래슨느 구성요소를 조합하여 객체를 생성하는 역할을 함. class Member { private var name: String = "" private var gender: String = "" private var age: Int = 0 private var job: String = "" class Builder( // 필수 매개변수 val name: String, val gender: String) { // 선택적 매개변수 var age = 25 var job = "" fun age(age: Int): Builder { this.age = age return this } fun job(job: String): Builder {..

안드로이드 2022.10.02

[코틀린] BackingField & Backing Properties

💡 Property ? - 코틀린에서 필드에 대한 기본 접근자 메소드를 자동으로 만들어주는데 때문에 필드 대신 프로퍼티라는 말을 사용. Backing Field 프로퍼티의 값을 저장하기 위한 필드 적어도 하나의 접근자가 기본으로 구현되는 접근자를 사용. field 식별자를 이용하여 접근 가능. var count = 0 set(value) { if(value >= 0) field = value } Backing Properties 명시적으로 수행하려는 작업에서 사용. private var _table: Map? = null public val table: Map get() { if (_table == null) { _table = HashMap() // Type parameters are inferred ..

안드로이드 2022.10.01