devlog of ShinJe Kim

[TWIL] 2019-09-27

|

This Week I Learned

  1. Android
    • 중첩된 fragment에서 addToBackStack으로 stack에 넣은 뒤, 한 단계 이전의 fragment로 돌아가고 싶을 때에는 popBackStack을 하면 된다.
    • 이전의 TIL에서 해결하지 못했던 것을 해결했다. 여러개의 fragment를 중첩했을 때, 2단계 이상 차이 나는 fragment로 이동시켜야 할 때가 있다. 이 때 popBackStack(id, flags)을 사용하여 구현할 수 있다. 각 인자가 의미하는 바는 아래와 같다.
      • id: FragmentTransaction.commit()을 할 때마다 각 fragment에 id가 부여되는데 이 떄의 id를 의미한다. 공식 문서 설명으로는 어떻게 id가 부여되는지 잘 이해가 안되는데, 구현해본 결과 아마 쌓이는 순서대로 0, 1, 2 … 이렇게 부여되는 것 같다. 정확하게 알게 되면 다시 추가하기.
      • flags: 0 혹은 POP_BACK_STACK_INCLUSIVE의 값이다. 만약 POP_BACK_STACK_INCLUSIVE를 설정하고 id를 지정하면 해당 id와 일치하는 fragment를 찾을때까지 중첩된 fragment를 pop한다. id에 null을 넣으면 쌓여있던 모든 fragment가 pop된다.
      • 예를 들어 5개의 fragment가 중첩되어있다고 치자. 만약 5번째로 중첩된(stack의 가장 상위에 있는) fragment에서 popBackStack(1, POP_BACK_STACK_INCLUSIVE)를 실행하면 1의 id를 가진 fragment를 찾을때까지 총 3개의 fragment가 pop되고, 두 번째로 중첩된 fragment가 보여진다.
    • Button.isEnabled = true || false를 사용하면 버튼 클릭을 막거나 활성화 할 수 있다. 이를 사용하여 버튼의 중복 클릭을 방지할 수 있다.
    • dialog의 백그라운드 터치를 비활성화 하고 싶으면 fragment.isCancleable = true || false를 false로 설정하면 된다.
    • 네트웍 요청은 절대 메인 스레드에서 하면 절대 안된다.
    • 백그라운드 스레드에서 ui작업을 하면 절대 안된다. 만약 백그라운드 스레드에서 toast를 하려고 하면 Can't toast on a thread that has not called Looper.prepare()라는 에러가 날 것이다. 이 때에는 runOnUIThread() 라는 것으로 스레드를 묶어주면 해결된다.
    • call에서의 this는 해당 익명객체를 의미함. 그래서 명시적으로 this@MainActivity 라고 액티비티를 지정해주어야 함.
  2. retrofit
    • HTTP Request에서 발생하는 아래와 같은 보일러플레이트를 효과적으로 제거할 수 있게 해준다.
      • OkHttpClient로 설정해주어야 하는 수많은 작업
      • 동기(Synchronous) 작업을 별도의 스레드에서 작업할 수 있게 해줌(?) 동기/비동기, 스레드 공부 뒤에 다시 이해해보자
      • 비동기(Asynchronous)로 할 떄에는 UI를 벡그라운드스레드에서 작업하지 않도록 주의해야 한다. 이 때 별도의 코드를 넣지 않아도 retrofit 내부에서 처리를 해주어 오류가 발생하지 않도록 해준다. 예를 들어 call 요청시 onfailure, onresponse에서 ui를 다룰 때 메인 스레드에서 할 수 있도록 내부적으로 처리해줌. 그래서 여기서 toast 등을 해도 에러가 안난다.
      • 응답을 Gson을 통하여 객체로 변환해준다.
  3. rxjava2
    • rx의 adapter는 call을 rx의 observable로 변환해주는 역할을 함.
    • Jake Wharton님의 라이브러리에 감사하기.
    • disposebag 쓰고 난 다음 onDestroy에서 dispose() 해줘야 함.
    • 스레드의 동작은 결정되어 있지 않고 프로그래머가 세팅할 수 있게 하는게 중요하다고 함.
    • throttleFirst로 연속클릭 방지 처리. 사실은 clickenable = false로 처리하는게 맞음.
    • throttleFirst, throttleLast는 1-3초정도로 간격이 짧을 때에는 별 의미가 없다. 하지만 5초 이상의 간격으로 시간이 길 때에는 제대로 써줘야 알맞는 데이터가 들어간다.
  4. 기타
    • 왜 개발자가 동기/비동기를 선택할 수 있게 만들어놓았을까? -> 별도의 스레드가 있으면 동기로 하는 것이 편하기 때문에
    • 만약 400~499 에러가 났다면 요청이 실패한 것일까? 아니다. MDN에서는 400 Bad Request를 다음과 같이 정의하고 있다.

      HyperText Transfer Protocol (HTTP) 400 Bad Request 응답 상태 코드는 서버가 클라이언트 오류(예: 잘못된 요청 구문, 유효하지 않은 요청 메시지 프레이밍, 또는 변조된 요청 라우팅)를 감지해 요청을 처리할 수 없거나, 하지 않는다는 것을 의미합니다.

    • http 요청할 때 항상 url 인코딩을 확인하자.
    • 확장함수는 함부로 만드는 것이 아니다. 왜..였지? 코틀린 책 다시 보고 숙지하기.

TODO

  • 이번 비밀번호 변경때 사용한 라이브러리 다시 하나씩 찾아보고 어떤 역할을 하는지 명확하게 숙지하자.
  • 왜 메소드? 인터페이스? 에서 항상 자기 자신을 인자로 받도록 해놓았을까? call.enqueue를 할 때 call을 인자로 받는 이유?
  • 비동기의 핵심은 별도의 스레드라고 한다. 무슨말인지 공부해서 다시 정리해보자.
  • 안드로이드에서의 메인 스레드/백그라운드 스레드 공부 및 정리
  • Observer 패턴 정리
  • 안드로이드에서 보일러플레이트를 줄이기 위해 AOP(관점 지향 프로그래밍)를 한다. AOP 찾아보고 정리하자.
  • 레트로핏 protocol buffer converter? protocol buffer가 뭔지 찾아보자.

읽을거리

Comments