전체 글 (68) 썸네일형 리스트형 코틀린 Flows의 소개 Flow는 코틀린 언어에 있는 것으로 특정시간에 걸쳐 여러 값을 순차적으로 방출하는 특징이 있는 것입니다. 예를 들면 Flow를 사용하여 API에 최신 업데이트를 가져와 Flow 연산자로 수정할 수 있습니다. Flow에 대해 설명하기 전에 Hot/Cold stream에 대해서 짚어보겠습니다. HotStream은 수신자가 없어도 데이터를 전송합니다. 반해 ColdStream은 수신자가 있을 때만 전송합니다. 예를 들어 Channels은 HotStream 입니다. HotStream은 매번 data flow 가 있기 때문에 수신자를 제어해야합니다. 데이터 손실 혹은 메모리 누수를 일으킬 수 있기 때문입니다. 반면 ColdStream은 요청할 때만 수집을 시작합니다. kotlin의 flow는 코틀린의 Corou.. 서비스 서비스는 UI를 제공하지 않고 백그라운드에서 실행되는 컴포넌트이다. 서비스 자체가 메인스레드가 아닌 별도 스레드에서 실행하는 것으로 착각하면 안된다. 서비스에서 UI를 블로킹하는 작업이 있다면 백그라운드 스레드를 생성해 작업을 진행해야 한다. 서비스는 단일 인스턴스로 실행된다. 그렇기 때문에 일부러 싱글톤으로 만들 필요는 없다. 서비스 시작 방법 startService() 와 bindService() 메서드 두가지가 있다. 스타티드 & 바운드 서비스 서비스는 보통 스타티드 서비스 or 바운드 서비스로 존재하는데, 스터디드이면서 바운드일 수 있다. 이는 코드도 복잡하고 고려해야할 것이 두 배 이상이 되기 때문에 피하는 게 좋지만 어쩔 수 없이 사용해야 하는 경우가 있다. 예를 들어, 음악 재생화면이 있을 .. Android에서 Context란? (What is Context in Android) 콘텍스란 애플리케이션 리소스와 클래스를 접근하기 위한 인터페이스를 제공하는 abstract class입니다. 위 그림을 보면, 애플리케이션과 서비스의 콘텍스트는 ContextThemeWrapper 클래스를 상속받지 않기 때문에 애플리케이션의 테마에 접근이 불가하여 기본테마로 보여지게 됩니다. 콘텍스트를 사용할 때는 메모리릭에 주의하기 위해서 각 context의 생명주기를 파악하고 사용해야 합니다. 특히 코틀린의 object 등의 정적클래스에서 사용을 주의해야 합니다. class MainActivity: Activity() { companion object { lateinit var mTextView: TextView } override fun onCreate(savedInstanceState: Bundl.. 안드로이드 태스크 ( Android Tasks) 태스크란? (What is Task?) 태스크는 액티비티 작업 묶음 단위라고 보면 됩니다. 앱과 태스크는 1:1 대응이 아닙니다. 여러 개의 앱이 하나의 태스크가 될 수도 있고, 필요하면 하나의 앱에서도 태스크를 여러개 가질 수 있습니다. A task is a collection of activities that users interact with when tying to do something in your app. Mutliple apps can be one task, and one app can have multiple tasks if necessary. 백스택 (Back Stack) 액티비티는 백 스택(back stack)이라 불리는 스택에 차례대로 쌓인다. Intent.FLAG_ACTIVITY_.. 프래그먼트 간 데이터 전달 (Fragment Result API) 프래그먼트간 데이터 전달 방법엔 여러가지 방법이 있습니다. 1. bundle과 FragmentManager로 전달 2. Fragment Result API를 이용하여 전달 3. Fragment간 shared ViewModel로 전달 4. Jetpack의 Navigation 에서 제공하는 safe-args로 전달 오늘은 Fragment Result API를 이용하여 전달하는 방법에 대하여 기술하겠습니다. 해당 API를 사용하기 위해서는 build.gradle에 아래와 같이 설정합니다. dependencies { def fragment_version = "1.4.1" //1.3.0-alpha04 이상 // Kotlin implementation "androidx.fragment:fragment-ktx:$fr.. 보기 좋은 방법으로 Multiple Coroutine 기다리기 val downloadBooksJob = launch { downloadBooks() } val downloadMoviesJob = launch { downloadMovies() } val downloadSongsJob = launch { downloadSongs() } downloadBooksJob.join() downloadMoviesJob.join() downloadSongsJob.join() // this line will not run until ALL of the downloads complete 위 방식을 이용하는 것 보다 Collection.joinAll 을 이용하는게 더 보기 좋아진다. val downloadJobs = listOf( launch { downloadBooks() }, la.. 안드로이드 프로젝트의 리뷰어들의 체크리스트 Memory Leaks - context를 유지하는 코드 조각이 있는지? - RxAndroid Code랑 연관이 있따면 RxCall이 생명주기의 끝에 없어지는지? - coroutine을 사용하고 있다면, Jab이 런취되고 viewModel 스코프에 의해 적절히 해방이 되는지? - 만일 CountDownTimer나 AsyncTask를 비디오/오디오 플레이어에서 사용하고 있다면, momory 리소스를 적절히 해방시키는지? - ViewBinding을 사용하고 있다면 onDestroyView에서 null로 셋팅시키는지 Resource Annotations fun showMessage(context: Context, val idRes: Int) { Toast.makeText(context, idRes, Toast.. inline, noinline, crossinline inline 이란? 고차 함수를 사용하면 런타임 패널티가 있기 때문에 함수 구현자체를 코드에 넣음으로써 오버헤드를 없앨 수 있다. >> 고차함수는 객체를 생성하기 때문에 생기는 오버헤드라고 볼 수 있습니다. 인라인은 인스턴스를 만들지 않고 코드를 호출하는 위치에 그대로 복사해서 컴파일되는 바이트코드의 양은 많아지겠지만, 추가적인 객체 생성은 없습니다. inline 함수는 내부적으로 코드를 복사하기 때문에, 인자로 전달 받은 함수는 다른 함수로 전달되거나 참조할 수 없습니다. 그래서 필요한 것이 noinline입니다. noinline 인자 앞에 noinline 키워드를 붙이면 해당 인자는 inline에서 제외됩니다. 따라서 다른 함수의 인자로 전달하는 것이 가능해집니다. crossinline inline .. 이전 1 2 3 4 5 6 ··· 9 다음 목록 더보기