[TWIL] 2019-09-27
27 Sep 2019 | TILThis Week I Learned
- 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
라고 액티비티를 지정해주어야 함.
- 중첩된 fragment에서
- retrofit
- HTTP Request에서 발생하는 아래와 같은 보일러플레이트를 효과적으로 제거할 수 있게 해준다.
- OkHttpClient로 설정해주어야 하는 수많은 작업
- 동기(Synchronous) 작업을 별도의 스레드에서 작업할 수 있게 해줌(?)
동기/비동기, 스레드 공부 뒤에 다시 이해해보자 - 비동기(Asynchronous)로 할 떄에는 UI를 벡그라운드스레드에서 작업하지 않도록 주의해야 한다. 이 때 별도의 코드를 넣지 않아도 retrofit 내부에서 처리를 해주어 오류가 발생하지 않도록 해준다. 예를 들어 call 요청시 onfailure, onresponse에서 ui를 다룰 때 메인 스레드에서 할 수 있도록 내부적으로 처리해줌. 그래서 여기서 toast 등을 해도 에러가 안난다.
- 응답을 Gson을 통하여 객체로 변환해준다.
- HTTP Request에서 발생하는 아래와 같은 보일러플레이트를 효과적으로 제거할 수 있게 해준다.
- rxjava2
- rx의 adapter는 call을 rx의 observable로 변환해주는 역할을 함.
- Jake Wharton님의 라이브러리에 감사하기.
- disposebag 쓰고 난 다음 onDestroy에서 dispose() 해줘야 함.
- 스레드의 동작은 결정되어 있지 않고 프로그래머가 세팅할 수 있게 하는게 중요하다고 함.
throttleFirst
로 연속클릭 방지 처리. 사실은 clickenable = false로 처리하는게 맞음.throttleFirst
,throttleLast
는 1-3초정도로 간격이 짧을 때에는 별 의미가 없다. 하지만 5초 이상의 간격으로 시간이 길 때에는 제대로 써줘야 알맞는 데이터가 들어간다.
- 기타
- 왜 개발자가 동기/비동기를 선택할 수 있게 만들어놓았을까? -> 별도의 스레드가 있으면 동기로 하는 것이 편하기 때문에
- 만약 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