4/14 수업

hyunji·2023년 4월 14일
0

빠르게 실패하기 VS 안전하게 천천히 실패하기

  • 개발자의 입장에서는 빠르게 실패하기가 좋다
  • 하지만 유저의 입장에선 데이터가 날라가기 때문에 좋지 않다
  • 따라서 빠르게 실패하되 유저의 데이터가 복구될 수 있는 방법으로 가는 방향도 좋고 좋은 기준을 스스로 세우는 것이 중요
  • 레아는 빠르게 실패하자 주의
    - why? 새로 들어오는 신입 개발자는 앱 내의 데이터를 잘 인지하지 못함. 이럴 땐 빠르게 실패하면 그 혼동을 빠르게 줄일 수 있어 좋다고 생각

Applicaiton과 Activity

LocalDate / LocalTime / LocalDateTime

  • java.util.Date은 변경 가능하므로 적절하지 않다.
  • JDK 1.8 이후에는 java.time 패키지를 사용 권장

Serializable vs Parcelable

  • 직렬화 가능 인터페이스
  • Parcelable이 속도가 조금 더 빠름
  • 왜 빠른지 내부 구현은 공부 좀 더 해보길
  • Parcelable은 안드로이드 의존성이 있음
  • 단위 테스트에서 안드로이드 의존성이 있다면 test가 아니라 android test에서 진행되게 된다.
  • Parcelable은 코드 작성량이 많아진다
  • @Parcelize를 붙이면 편하게 Parcelable를 구현할 수 있다.
    - https://developer.android.com/kotlin/parcelize#kts 참고

ListView 아이템 클릭 감지

  • setOnItemClickListener
listView.setOnItemClickListener { _, _, position, _ ->
    // ...
}

View 크기 단위

  • 뷰 사이의 간격을 지정할 땐 dp
  • 텍스트 크기를 지정할 땐 sp
  • 크기를 조절할 때 원하는 크기로 조절이 되도록 만들어야 한다.

화면 회전 시 데이터 유지

  • 왜 화면이 회전되었을 때 데이터가 날라갈까?
    - 앱이 destroy() 되고 다시 실행되는 과정을 거치기 때문
    - 구성 변경이 일어나면 안드로이드 액티비티가 재생성되는 과정을 거침

안드로이드 개발을 할 때는 공식 문서를 활용하는 습관을 키워라!!!!!!!!!

효율적으로 복잡한 UI 그리기

  • 장풍쏘게 되면 UI의 응답성이 떨어지고 성능이 저하됨
  • View LifeCycle과 연관지어 생각해보자!!!!
  • layout inspector 에서 메모리를 확인할 수 있음

라이브 코딩

  • 뷰의 비율을 조절한다거나 간격을 맞춰 조절하기를 원할 때 constraintDimesionRatie = 0.7 이렇게 이 특성을 사용해 비율을 조절한다.
  • id가 +가 붙은것도 있고 아닌 것도 있음. 아이디를 선언할 때를 보면 +는 아이디를 추가한다는 뜻이다. 그래서 레퍼런스 부분에서는 +를 뗴줘도 됨
  • 포스터의 높이를 고정하지 않으면 sp와 dp와의 차이때문에 생기는 뷰의 오차를 해결할 수 있다.
  • tools : 프리뷰에서 렌더링 할 때만 데이터를 확인 가능

리스트뷰

  • 3가지 필수 요소: view, item, Adapter
  • 어댑터 getView에서 viewHolder을 쓰면 부드러운 스크롤링 가능
    - SupperssLint("ViewHolder")를 getView위에 닮
  • string resource를 사용하는 이유는 글로벌 앱이 되었을 때 분기를 칠 수 있도록 사용하는 것
  • 어댑터에 context를 넘겨줄 필요 X, 뷰나 parent의 context를 가져오면 됨.
  • @DrawableRes : 드러블 리소스 값을 갖고 있는 자료형이라는 표시

더 나은 ListView 만드는 방법

  • 뷰 껍데기 재사용
    - convertView: 레이아웃 인플레이트를 줄려주는 것
    - 기존의 뷰를 재활용할 수 있게 해주는 것
    val view: View = convertView ?: LayoutInflater
        .from(context)
        .inflate(R.layout.movie_item, parent, false)
  • findViewById() 줄이기
    - viewHolder : findViewById() 호출이 줄어들도록 해줌
fun getView(position: Int, convertView: View?, parent........){
	/*...*/
    
	val viewHolder: ViewHolder
	val view = if(convertView != null){
		convertView.also { viewHolder = it.tag as viewholder }
    	//tag를 사용하지 않아도 뷰홀더 저장가능, 하나의 방법일 뿐
	} else {
		val view - LayoutInflater
    		.from(context)
        	.inflate(R.layout.movie_item, parent, false)
    	viewHolder = ViewHolder(view.findViewById(R.id.title))
        view.tag = viewHolder
        view
	}
}


class ViewHolder(
	val title: TextView
)
  • 리스너 연결이 중복 호출되지 않게 하게(숙제)
    - position을 이용해 어댑터 바깥에서 리스너 연결이 되도록 수정

0개의 댓글