jminie-o8o / kotlin-starbucks

그룹 프로젝트 #3
1 stars 1 forks source link

[Android] Josh & 스타크 이슈 정리 #6

Closed junseokseo9306 closed 2 years ago

junseokseo9306 commented 2 years ago

Single Activity

Single Activity 싱글 액티비티는 하나의 액태비티를 두고 나머지 화면을 모두 프래그먼트로 구성하는 아키텍쳐로 Google I/O 2019 에서 Jetpack Navigation과 함께 소개

SignleActivity 의 장점

junseokseo9306 commented 2 years ago

코루틴 LiveData에 직접 add 적용 시 이슈 사항

LiveData 안에 MutableList 선언시 add 사용하면 발생하는 문제점

private val _homeContentsDetail = MutableLiveData<MutableList<Details>>()
val homeContentsDetail: LiveData<MutableList<Details>> = _homeContentsDetail

_homeContentsDetail.value.add( List ) 

위처럼 MutableLiveData 에서 setValue Add 메소드는 제대로 작동하지 않음.

@MainThread
protected void setValue(T value) {
    assertMainThread("setValue");
    mVersion++;
    mData = value;
    dispatchingValue(null);
}

위와 같은 방법으로 livedata는 버전관리를 하기 때문 참고 : 스타크 블로그

해결책

private val _yourRecommendProductsList: MutableList<YourRecommendProducts> = mutableListOf()
private val _yourRecommendProducts = MutableLiveData<MutableList<YourRecommendProducts>>()
val yourRecommendProducts: LiveData<MutableList<YourRecommendProducts>> = _yourRecommendProducts

_homeContentsDetailImage.value = _homeContentsDetailImageList

새로운 mutableList를 만들고 다시 liveData에 대입해 주는 방법을 사용

junseokseo9306 commented 2 years ago

비동기 처리

기존 코드

for (i in 0 until homeContents.value?.yourRecommend?.products?.size!!) {
    val job1 = async {
        val yourRecommendProducts =
        repository.loadStarbucksContents(homeContents.value?.yourRecommend?.products!![i].toLong())
        yourRecommendProducts?.view?.let {
        _homeContentsDetailList.add(it)
        _homeContentsDetail.value = _homeContentsDetailList
       .....
    }
}
image

수정 후 1번

for (i in 0 until homeContents.value?.yourRecommend?.products?.size!!) {
    val job1 = async {
        val yourRecommendProducts =
        repository.loadStarbucksContents(homeContents.value?.yourRecommend?.products!![i].toLong())
         yourRecommendProducts?.view?.let {
        _homeContentsDetailList.add(it)
        _homeContentsDetail.value = _homeContentsDetailList
       .....
    }
}.await() 
image

수정 후 2번

val contents = MutableList<Details>(1024) { null }

for (i in 0 until homeContents.value?.yourRecommend?.products?.size!!) {
    val job1 = async {
        val yourRecommendProducts =
        repository.loadStarbucksContents(homeContents.value?.yourRecommend?.products!![i].toLong())
        yourRecommendProducts?.view?.let {
        contents[i] = it
       .....
    }
.awaitAll()

위와 같은 방식으로 contents[i] 의 순서를 강제하여 넣음 이렇게 되면 비동기적으로 작동하더라도 contents[i]의 위치를 알고 있기 때문에 비동기적으로 실행하여도 순서가 다르게 들어오지 않게됨.

junseokseo9306 commented 2 years ago

엑티비티와 프래그먼트간의 AAC viewModel 공유 방법

fragment에서 위와같이 새로운 viewModels() 호출

- 수정후

private val viewModel: ViewModel by activityViewModels()


이렇게 activityViewModels() 를 호출하면 액티비티와 프래그먼트간에 뷰 모델 공유 가능.
junseokseo9306 commented 2 years ago

Nested Scroll View 오류

기존 코드

수정 후

junseokseo9306 commented 2 years ago

텍스트 중간 컬러만 바꾸기

SpannableStringBuilder 사용

@BindingAdapter("string")
fun setColorTextView(view: TextView, text: String) {
    val textLen = text.length
    val subtitle = view.context.getString(R.string.your_recommend_title_example)
    val spannable = SpannableStringBuilder(text)
    spannable.append(subtitle)
    spannable.setSpan(
        ForegroundColorSpan(Color.RED),
        0,
        textLen,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    view.text = spannable
}
image

SpannableStringBuilder 를 사용하여 Spannable 값을 지정해 줌 이렇게 하게 되면 특정 위치의 문자열만 색깔등 여러가지를 바꿀 수 있음

junseokseo9306 commented 2 years ago

안드로이드 네비게이션 백스택 관리

현재 프래그먼트 네비게이션 관계도

image

문제 해결 방법

image

위와 같이 했을때 home fragment 에서 백버튼을 누르면 앱이 종료되는 이유 는 다음과 같다.

navigation_backstack


네비게이션 백스택이 쌓이는 구조

image

네비게이션 pop Behavior 의 기본적인 원칙

1.액션의 popUpTo 속성은 주어진 도착점(destination)이 나올 때까지 백 스택을 팝업한다.

  1. popUpToInclusive 속성이 false이거나 설정되지 않은 경우, popUpTo 는 지정된 도착점까지 모든 도착점들을 제거한다. 하지만 지정된 목적지는 백 스택에 들어있다.
  2. popUpToInclusive 속성이 true인 경우, popUpTo 속성은 주어진 목적지를 포함해서 모든 목적지들을 백 스택에서 제거한다.
  3. popUpToInclusive 속성이 true이고 popUpTo가 앱의 시작점으로 설정된 경우, action은 백 스택의 모든 도착점을 제거한다. 백 버튼을 누르면 바로 앱을 종료한다.

참고 블로그