전체 글 103

[Android] Glide vs Picasso

이미지 라이브러리 중 가장 유명한 Glide와 Picasso입니다 각각 장단점은 잘 모르고 있었던터라, 한번 조사해봤어요 Glide Glide.with(context) .load(imageUrl) .apply(RequestOptions() .centerCrop() .placeholder(R.drawable.loading_spinner) .diskCacheStrategy(DiskCacheStrategy.ALL)) .into(imageView) 장점 - GIF, webp 지원 - 이미지 로딩 성능이 좋다 - 생명주기와 연동된다 Glide.with(context) context가 Activity / Fragment 에 따라 해당 컴포넌트 생명주기와 연동해 동작합니다 ex) 이미지 로딩이 진행 중인데 컴포넌트들..

📱 Android 2024.03.17

[Android] @IgnoredOnParcel

통신을 위해 model을 설계했는데, 클라이언트에서만 사용하는 변수가 필요한 상황입니다 클라이언트에서만 사용될 값을 추가하는데, 만약 이게 서버 통신에서 쓰인다면.. 아찔한 상황입니다 T_T 이럴 경우엔, IgnoredOnParcel 을 사용합니다 @IgnoredOnParcel - Parcelize annotation이랑 함께 사용되는데 특정 필드가 Parcelable 구현에서 제외시킵니다 즉 Parcelable 인터페이스를 구현할 때 고려되지 않으므로, 인텐트에 데이터를 넘기거나 상태를 저장/복원하는 과정에서 이 변수는 무시되고, 클라이언트 상에서만 사용할 수 있습니다 :) @Parcelize data class User( val name: String, val age: Int, @IgnoredOnPa..

📱 Android 2024.02.25

[kotlin] forEach(람다식)의 return break, continue처럼 사용하기

return 가장 가까운 enclosing function을 return 시킨다 val arr = arrayListOf("A","B","C","D","E","F","G") fun checkForEach() { arr.forEach { if(it == "D") return } println("찍힐까요 안 찍힐까요?") } 위의 예제를 실행하면 어떤 결과가 나타날까? 더보기 checkForEach()를 return 시키므로, println문이 찍히지 않는다 함수내의 lambda식을 return하고 싶다면? return@label 특정 label의 lambda식을 return 한다 val arr = arrayListOf("A","B","C","D","E","F","G") fun checkForEach() { ..

💡 Kotlin 2024.01.05

[Android] fragment - lifecycleOwner / viewLifecycleOwner

Fragment에서 LiveData observe를 사용하면서 아래처럼 LifecycleOwner를 사용하게 되었는데, lifecycleOwner와 viewLifecycleOwner의 차이가 무엇인지에 대해 알아보고자 합니다 LifecycleOwner - 프래그먼트 자체의 생명주기를 갖는 class - fragment가 추가되고, 소멸될때까지의 lifecycle viewLifecycleOwner - 프래그먼트 뷰의 생명주기를 갖는 class - onCreateView~onDestroyView viewLifecycleOwner가 권장되는 이유? Fragment의 lifecycle(앞서 언급했던 lifecycleOwner)는 Fragment View의 lifecycle보다 더 긴 것에 주목해야합니다 만약, ..

카테고리 없음 2023.09.17

[Android] SingleLiveEvent , EventWrapper

SingleLiveEvent : 화면 회전 등 구성요소 변경 시, 이벤트가 여러번 호출되는 걸 방지하기 위해 사용 -> 단일 이벤트 사용 import android.util.Log import androidx.annotation.MainThread import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import java.util.concurrent.atomic.AtomicBoolean class SingleLiveEvent : MutableLiveData() { private val pending = AtomicBoolean(false) @Main..

📱 Android 2023.09.03

[Bug / Android] Glide ImageView 깜빡임 해결

🐛 RecyclerView 사용 중, 리스트뷰의 라디오버튼을 클릭할 때마다 리스트 항목들의 이미지뷰가 깜빡이는 현상이 발생 어디서 문제인지 몰라서, 하나씩 체크해봤다 1. Recyclerview setHasStableIds RecyclerView Adapter에 getItemId 선언 후, id를 선언해준다 override fun getItemId(position: Int): Long { return items[position].id.toLong() } onCreateViewHolder 에서 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { setHasStableIds(true) //.....

🐛 버그 2023.08.27

[Android] viewModels vs activityViewModels

(Hilt 사용) ViewModel을 초기화할 때 viewModels()만 사용해봤었는데 activityViewModels의 존재를 알게됐어요 두 가지의 차이점에 대해 알아봅시다! 🔍 왜 이렇게 처음보는게 늘 많은지 T_T 멀고도 험한... viewModels() 해당 ViewModel을 초기화하는 Component의 LifeCycle을 따름 activityViewModels() @MainThread public inline fun Fragment.activityViewModels( noinline extrasProducer: (() -> CreationExtras)? = null, noinline factoryProducer: (() -> Factory)? = null ): Lazy = createVi..

📱 Android 2023.07.27

[Android] DataBinding BindingAdapter 사용하기

데이터 바인딩을 사용할 때 view의 attributes를 커스텀으로 추가해 사용할 때 즉, 쉽게 말하자면 xml에서 원하는 속성을 만들어서 사용하는 방식입니다 어떤 속성을 만드는지에 따라서 무궁무진하게 사용됩니다 :) 기본 형태 @BindingAdapter("xml에서 사용할 명칭") fun setAB(속성과 연결된 뷰 타입, T) { // ... } 실제 코드를 보자면 ImageView에 적용하는 예시니, 첫번째 param은 ImageView이고 함수 안에서 사용될 데이터는 String 값임을 알 수 있습니다 @BindingAdapter("setImgUrl") fun setImgUrl(view: ImageView, url: String) { Glide.with(view).load(url).into(v..

📱 Android 2023.07.27

[Android] Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20)

🔐 어딘가에서 충돌이나서 생기는 거 같은데, 공식적인 해결방법은 없는 것 같고 구글링하다가 제대로 동작하는 부분을 찾았습니다 :) 하나하나 라이브러리 비교하기에는 무리가 있을 거 같아서 ㅠㅠ 아래의 방법을 따라했습니다 🔑 build.gradle(app)에 아래의 소스를 추가합니다 constraints { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") { because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") } implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") { because("kotlin-stdlib-jdk8 is n..

📱 Android 2023.07.22

[Git , SourceTree] GitHub 토큰 발급하기 , cherrypick

버전관리를 위해 사용하는 Git Git의 GUI 프로그램으로는 SourceTree를 썼다 하지만 나는 여러명이서 소스코드를 같이 관리해본 경험이 없기때문에 배워야할게 많다.. 토큰 발급받기 2021년 하반기 이후로는 토큰을 반드시 사용하도록 변경되었다 Github - 프로필 - settings 선택 Developer Settings 선택 developer settings -> generate new Token (classic) 선택 만료일은 필요한 만큼 정하고 , scope는 전체를 체크했다 ⭐️ 토큰 생성 후 꼭 꼭 꼭 저장해두기 CherryPick 원하는 커밋만 가져오고 싶을 때 예를 들어, feat/a에서 2개를 커밋한 후 첫번째 커밋만 가져오고 싶을 때 1. feat/a 생성 후 2개 커밋 2. ..