월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Coroutine, Flow 질문
안녕하세요. 강의 잘 듣고 있습니다!아래 질문이랑 거의 비슷한 질문이긴한데 확실히 하고싶어 문의드립니다 import kotlinx.coroutines.*import kotlinx.coroutines.flow.*fun main() = runBlocking<Unit> { // Launch a concurrent coroutine to check if the main thread is blocked launch { for (k in 1..3) { println("I'm not blocked $k") delay(100) } } // Collect the flow simple().collect { value -> println(value) } // println("test") }fun simple(): Flow<Int> = flow { // flow builder for (i in 1..3) { delay(100) // pretend we are doing something useful here emit(i) // emit next value }} runBlocking{} 내부에서 launch {} 로 코루틴이 생성그다음 simple().collect{} 코드가 실행되는데 이것도 코루틴으로서 생성launch 로 생성한 코루틴이 실행 -> println("I'm not blocked $k") 코드 출력flow 코루틴 실행-> collect 된 value 출력3,4 반복이해한게 맞을까요? 그리고 타이밍에 따라서 결과값이1I'm not blocked 12I'm not blocked 2 3I'm not blocked 3 이렇게 나올수도 있나요? 챗지피티는 타이밍 때문에 출력 순서가 바뀔수 있다고 해서요 ..
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Transformations import 안됨
androidx.lifecycle 패키지에 Transformations 가 없어서 참조가 안됩니다! Unresolved reference라고 하네용..Deprecated 된것 같진 않은데 사용방법이 달라진걸까요?val userLD : LiveData<User> = ...; val userFullNameLD: LiveData<String> = userLD.map { user -> user.firstName + user.lastName }공식문서에 보니 이것처럼 먼저 생성한 LiveData나 MutableLiveData 를 참조해서 map 을 사용하는데 이런식으로 사용해야할까요?+) 그리고 transformations 를 사용하는 이유나 언제 사용해야하는지? 이해가 잘 안되는데, 예시처럼 prefix나 suffix 가 필요할 때 사용하기 좋은가요?MainActivity 에서 myViewModel.liveCounter.value = myViewModel.liveCounter.value?.plus(1) 이건 원본 데이터를 조작한게 아닌건가요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
moshi관련 질문입니다.
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") } android { namespace = "com.example.booksearchapp" compileSdk = 34 defaultConfig { applicationId = "com.example.booksearchapp" minSdk = 23 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { buildConfig = true viewBinding = true } } dependencies { implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.legacy:legacy-support-v4:1.0.0") // Retrofit implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-moshi:2.9.0") // Okhttp // define a BOM and its version implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0")) // define any required OkHttp artifacts without version implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") // Moshi implementation("com.squareup.moshi:moshi-kotlin:1.14.0") kapt("com.squareup.moshi:moshi-kotlin-codegen:1.14.0") // Lifrcycle implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.7.0") // Coroutines implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // Coil implementation("io.coil-kt:coil:2.5.0") // RecyclerView implementation("androidx.recyclerview:recyclerview:1.3.2") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") } 위처럼 설정을 하고 빌드를 할때 아래와 같은 에러가 발생합니다.Execution failed for task ':app:kaptDebugKotlin'.> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction > java.lang.reflect.InvocationTargetException (no error message)jdk는 17을 사용하고 있습니다.11로 설정하면 아래와 같은 에러가 나옵니다.is project is configured to use an older Gradle JVM that supports up to version 11 but the current AGP requires a Gradle JVM that supports version 17. 어느 부분을 수정해야될 지 모르겠습니다.. ㅜㅜ
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
searchBooks() 에서 북 검색 입력을 너무 빨리 할 경우 마지막 글자로 검색이 안돼요.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아래 코드를 private fun searchBooks() { var startTime = System.currentTimeMillis() var endTime: Long binding.etSearch.text = Editable.Factory.getInstance().newEditable(searchViewModel.query) binding.etSearch.addTextChangedListener { text: Editable? -> endTime = System.currentTimeMillis() if (endTime - startTime >= SEARCH_BOOKS_TIME_DELAY) { text?.let { val query = it.toString().trim() if (query.isNotEmpty()) { searchViewModel.searchBooksPaging(query) searchViewModel.query = query } } } startTime = endTime } }아래처럼 바꿔봤는데 입력 시마다 runnable을 매번 생성하는데 문제 되진 않을까요? 코틀린에 익숙치 않아서 더 좋은 방법이 있다면 알고 싶습니다. private var handler: Handler = Handler(Looper.getMainLooper()) var runnable: Runnable? = null private fun searchBooks() { binding.etSearch.addTextChangedListener { text: Editable? -> if (runnable != null) { handler.removeCallbacks(runnable!!) } // 텍스트 입력 후 N 초 간 입력 없으면 검색 실행 runnable = Runnable { text?.let { Log.d(TAG, "text:$it"); val query = text.toString().trim() if (query.isNotEmpty()) { bookSearchViewModel.searchBooks(text.toString()) bookSearchViewModel.query = query } } } handler.postDelayed(runnable!!, Constants.SEARCH_BOOKS_TIME_DELAY) } }
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
안드로이드에서 아키텍처 패턴
안녕하세요. 강의 잘 듣고 있습니다.안드로이드 패턴에 대해서 몇 시간동안 듣고 검색도 해보면서 이해하는 중인데 어려움이 있어 질문을 드립니다. MVC에서 그림에서 이해가 안되는 부분이 있습니다. [1] 안드로이드에서 버튼은 결국 View가 가지고 있고 이벤트는 View에 있는 버튼을 눌러서 발생하기 시작할 것 같습니다. 그럼 뷰는 입력 받은 이벤트에 대해 컨트롤러에게 전달을 해줘야할 것이고 컨트롤러는 전달 받은 이벤트에 대한 작업을 수행하고 모델에 전달 후 모델의 변경을 다시 뷰에게 전달해주는 것인데 이런 생각으로 인풋은 뷰쪽으로뷰와 컨트롤러는 쌍방향 화살표가 되어야한다고 생각했습니다. [2] MVP에 경우에 View와 Model사이 간접적 화살표가 사라졌는데, MVP에 경우에도 프레젠트를 사이에 두고 모델에 데이터가 뷰쪽으로도 이동해야만 한다고 생각이 들고 그렇다면 간접적으로 이동하는 것은 똑같으니 MVC에서 M->V 점선 화살표가 유지되어야 하는 거 아닌가 하는 생각이 들었습니다. [3] MVP에서 프레젠트가 인터페이스를 통해 뷰와 모델을 거치게 되는데[MVC] V <-> C[MVP] V <-> Interface <-> Presenter한 단계를 추가해서 의존성 주입(관심사를 세분화)라고 이해해도 될까요? 혹시나 시간이 되신다면 설명 부탁드립니다.
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
RecyclerView.Adapter vs ListAdpater
안녕하세요.ListAdapter로 리사이클러뷰를 생성할 때의 장점으로는 notify관련 함수를 개발자가 일일이 설정해줄 필요가 없고, DiffUtil을 통해 데이터 셋의 차이를 빠르게 계산해준다는 점이 있다라고 말씀해주셨는데 ... 그럼 기존의 Recyclerview.Adapter는 사용하지 않는 편이 더 좋은걸까요? 아니면 ListAdapter에 이러한 장점들이 있음에도 불구하고 Recyclerview.Adapter가 꼭 쓰여야하는 특별한 상황이 남아있을까요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Flows 와 Coroutine
안녕하세요, Flows 강의를 듣는와중에 문의사항이 있어 질문드립니다. 강의 내용을 캡쳐한 것인데요.여기서 launch{ } 를 통해 코루틴이 생성되고 simple() Flow 가 실행이 되는데 flow도 코루틴으로 이루어져 있어서 마치 동시에 실행되는 것처럼 보이는게 제대로 이해한건지 궁금합니다.만약 simple() flow 대신 println("test") 와 같은 메인Thread 를 사용하는 함수가 작성되어 있었다면 test가 먼저 찍히고 I'm not blocked 1 이 먼저 나오는게 맞을까요??아니면 I'm not blocked 1 이 나오고 test 가 찍히는게 맞을까요..?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
[BookSearchAdapter] onBindViewHolder의 currentList[position] 질문
안녕하세요 선생님! 강의 잘 듣고 있습니다.한 가지 궁금한게 있어서 질문 남깁니다.다름아니라, BookSearchAdapter의 onBindViewHolder에서 book의 position을 currentList에서 가져오시던데,val book = currentList[position]과val book = getItem[position]의 차이점이 무엇인지 궁금합니다...!기능적으로 차이가 없다면, 경우에 따라 어떤 것을 사용하는것이 더 효율적인지 궁금합니다! 감사합니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
코루틴 메모리 관련해서 질문드립니다!
스레드 내에서 여러개의 코루틴이 동작할 수 있다고 하셨는데(8분 51초쯤) 이런 경우에도 프로세스의 힙 메모리를 공유하여 동작하게 되는건지 궁금합니다 :)
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Java Bill Pugh Solution 에서 INSTANCE
Singleton Pattern 기초 강의 내용에서 질문드립니다.Bill Pugh Solution (Java) 부분에서 Holder 클래스를 보시면private static final DBHandler INSTANCE = new DBHandler();라고 되어있는데, 이 경우 getInstance() 함수를 통해 Holder.INSTANCE 가 호출이 되어도 fianl 로 선언되어있어 한번만 선언되기 때문에 signleton 으로 사용 가능하다는 말씀이 맞는지 궁금합니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
nested json에서 특정 부분만 파싱하는법
Moshi 질문 드립니다.{ "a" : { "b" :"123", "c" :[...] }}위와 같은 json이 있을 때 "c"만 파싱이 가능할까요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Fragment에서의 viewBinding
[ViewBinding 기초] 부분을 듣고 있습니다.Fragment()에서는 binding을 getter를 따로 만들고 사용하셨는데, 이렇게 사용하지 않고그냥 private var binding : FragmentFirstBinding? = null이라고 선언하고 onDestroyView에서binding = null 이라고 선언해주는 것과 강의에서 보여주신 방법과 차이가 무엇인가용?
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
toolbar 질문드립니다.
[ViewBinding 기초] 부분을 듣고 있습니다.toolbar는 레이아웃에 명시되어 있어도 setSupportActionBar를 사용해야만 표시되는 것 같은데 맞나요?혹시 그러한 요소(set을 해야만 보이는)인지는 어떻게 판단하나요? (ex: 문서에 ~라고 표시되어있음) 감사합니다.
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
EditText 에서 delay 주셔서 처리하셨는데 flow 의 debounce() 하고 같은건가요?
강의에서는 EditText 에서 delay 주셔서 if(startTime - endTime >= DELAY)입력시간이 DELAY 보다 작으면 무시하는 코드를 넣어주셨는데이부분이 혹시 Flow 의 debounce() 하고 같은건가요?Flow 로 대체해보고자 공부중입니다..^^;;
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
코루틴 관련 질문
"코루틴이 JVM의 힙 ㅁ메로리를 공유해서 사용한다. 따라서 스레드의 경우 한 스레드에서 다른 스레드로 넘어갈 때 컨텍스트 스위칭이 일어나지만 코루틴은 일어나지 않아 오버헤드가 적다" -> 이 전제에서 틀린 것이 있을까요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
오류
안녕하세요 수강 생 입니다다름이 아니라 part 10을 수강하고 있는 단계에서앱 빌드가 안되어 구글을 검색 해봤으나 실용적인 답변을 얻지 못해 문의 드립니다오류 코드 맥락은 대략 이해가 되나 코드가 잘 못 쳐진 부분이 없어 어떻게 해결 점을 찾아야 하는지 여쭤 보고 싶습니다
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
강사님! 직렬화 라이브러리를 Moshi, kotlin serialization 두개를 사용하시던데 이유가 있으신가요?
강사님! 직렬화 라이브러리를 Moshi, kotlin serialization 두개를 사용하시던데 이유가 있으신가요?찾아보니까 코틀린의 serialization 만 이용해도 되지 않을까해서요retrofit 에서도 제이크와튼이 만든 컨버터 라이브러리도 있더라구요?https://github.com/JakeWharton/retrofit2-kotlinx-serialization-converter#download그런데 0.8 버전이긴하네요;;;혹시 어떤 이유가 있으셔서 room 에는 serialization, retrofit 에는 moshi 를 사용하신걸까요?!그리고 매번 답변해주셔서 정말 감사합니다 (__)
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
EditText 는 kill 해도 값이 잘 저장되어있던데 혹시 제가 잘못테스트했을까요?
EditText 는 saveState 가 활성화되어있어서id 만 지정하면 시스템언어변경하거나해도 잘 불러오더라구요그래서 강사님처럼 kill 명어로도 강제 종료를 시켜봤는데그래도 잘 복원이 되더라구요강의에서 kill 로 종료하면 복구가 안되기 때문에 직접 뷰모델에 SaveStateHandle 을 이용하신다고 했는데그럼 실제 개발할때는 EditText 뷰인경우 SaveStateHandle 을 사용하지 않아도 될까요?
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
서버도 페이징 기능이 되는데 Paging 라이브러리가 필요할까요?
문득 페이징을 공부하다보니로컬 데이터의 경우 한꺼번에 받아오는 경우가 많아서 페이징이 필요하다고 생각되지만예제에 사용한 API 는 페이지 size 까지 정할 수 있는데 Paging 라이브러리를 사용하는 이점이 무엇이있을까 궁금합니다...!
- 해결됨냉동코더의 알기 쉬운 Modern Android Development 입문
GSON 이 아닌 Moshi 를 사용하시는 이유가 있을까요?
냉동코더님은 GSON 이 아닌 Moshi 를 사용하시는 이유가 무엇인지 궁금하네요!