목록FrontEnd (129)
만족
ListView가 낮은 성능을 보이는 데는 나의 경험에 기반한 몇 가지 이유가 있다. 1. getView 구현부에서 항상 view inflatation을 하는 경우 2. getView 구현부에서 ViewHolder패턴을 사용하지 않아 항상 업데이트하는 경우 3. ListView 높이 재설정 시 아이템 갯수만큼 measure하는 경우 4. 필요하지 않은 데이터까지 한번에 렌더링하는 경우 ListView 작업은 UIThread에서 이루어지기 때문에, 여기에서 많은 시간을 사용한다면 로그캣에 Layout Skipping메시지가 뜨면서 일정 시간동안 화면이 멈추게 된다. 위의 원인만 제거해주더라도 체감할 수 있을 정도의 성능 향상이 있을 것이다. 1. getView 구현부에서 항상 view inflatation..
안드로이드 개발자라면 누구나 한 번쯤은 ScrollView아래의 ListView를 사용했을 때 ListView의 높이가 쪼그라드는 문제를 경험해본적이 있을 것이다. 구글에 android listview height is weired처럼 검색하면 가장 많이 나오는 솔루션은 요런 함수를 쓰라는 내용이다. 웬만하면 리사이클러뷰를 사용하는 방법으로 회피해가려 하지만 "스크롤뷰+리스트뷰"조합으로 된 모든 코드를 뒤집어버릴 순 없으니 해당 부분에만 위의 함수를 적용시켜주고 있었다. 그런데 예상했던 것과는 달리 위의 함수는 연산시간을 꽤 잡아먹는 녀석이다. (특히 listItem.measure 부분) 200개의 요소가 있는 리스트뷰의 높이를 계산하려고 하니 소요시간이 1초가 넘어가버려서 앱 애니메이션이 뚝뚝 끊기는 ..
액티비티 A에서 액티비티 B로 데이터를 넘겨주는 방법중 하나는 Intent에 Object를 넣어서 전달하는 방법이다. 이 방법은 간단하지만 전달하려는 Object의 크기가 일정 이상이 되면 Exception이 발생하거나 느려지고 거쳐가는 액티비티의 갯수가 많은 경우 매우 번거로운 작업이 될 수 있다. 그래서 액티비티간에 object를 전달하지 않고, 새로운 클래스를 만든 다음, 해당 클래스의 static 멤버 변수에 값을 저장하고 필요한 액티비티에서 사용할 수 있도록 해 두었다. public class DataHolder{ private static List strList= null; public static void initStrList(){ List strs= new ArrayList(); strs...
문자 애플리케이션을 열어서 이동시키는것이 아닌, 코드 상에서 사용자의 추가 동작 없이 즉시 SMS를 보내는 방법은 다음과 같다. MMS로 보낼 경우 (장문문자 또는 멀티미디어 포함) 해당 메소드는 동작하지 않는다는 점에 유의하자. 물론 딱 보기에도 악용 가능성이 다분한 기능이기 때문에 매니페스트에 해당 권한을 명시하고, 사용자로부터 권한을 얻어오는 코드를 추가로 삽입해주어야 한다. 권한을 얻는 부분은 생략한다. 매우 간단하고, 빌드도 성공적으로 잘 된다. 그러나... 플레이스토어에 업로드할 경우 사유서를 작성해서 내야 한다 (악용할 경우 유료문자를 폭탄으로 보낸다던지 하는게 가능하기 때문이다) 나의 경우 해당 권한이 필요한 사유를 적어서 냈는데도 거절당했다는 문자가 왔다... 그럼 어떻게 해결하느냐? 간..
https://satisfactoryplace.tistory.com/97 [Android] 개발자 계정 만들기 플레이스토어에 앱을 올리기 위해서는 '구글 개발자 콘솔'에 계정을 등록해야한다. 준비물은 결제카드와 구글 계정이다. 바로 만들어 보자 우선 구글 개발자 콘솔에 들어가자. https://play.google.com/apps/publ.. satisfactoryplace.tistory.com 이 과정을 모두 완료했다면, 이제 다음과 같은 화면이 표시될 것이다. 우측의 '애플리케이션 만들기' 버튼을 클릭하고, 앱 제목을 입력하자. 제목은 추후 변경할 수 있으니, 게임 닉네임 정할 때 처럼 깊게 고민하지 않아도 된다... 이제 대시보드로 잘 넘어왔다면, 좌측 네비게이션에 주목하라. 체킹표시된 아이콘이 모..
React component 자신이 가진 상태값은 state라고 하고, setState를 이용해서 그 상태값을 변화시킨다. 그런데, this.setState()는 state를 비동기적으로 변화시킨다. 즉, this.setState() 라인이 호출되고 다음 라인으로 넘어갔을 때, this.state의 값은 바뀌었을 수도, 바뀌지 않았을 수도 있다는 말이다. 위의 코드를 보면, 실행되고 난 다음에는 this.state.value의 값이 101로 찍힐 것 같지만 실제로는 2가 나온다. (물론 다른 값이 나올 수도 있다) 왜 그럴까? setState()는 즉각적으로 상태를 업데이트하지 않고, Promise를 이용해 비동기적으로 상태를 변화시키기 때문이다. (Promise에 대해서 잘 모른다면, 다음 글을 참고하..
플레이스토어에 앱을 올리기 위해서는 '구글 개발자 콘솔'에 계정을 등록해야한다. 준비물은 결제카드와 구글 계정이다. 바로 만들어 보자 우선 구글 개발자 콘솔에 들어가자. https://play.google.com/apps/publish/?hl=ko 불러오는 중입니다... 로그인이 되어있지 않은 상태라면 로그인창이 뜨는데, 로그인해주면 된다. 로그인을 완료하면, 돈을 내라는 창이 뜬다. 25달러가 필요하지만, 우리는 미국인이 아니기 때문에 해외결제 수수료나 환율 등을 고려하면 약 3만원정도 나올 것이다. 충분한 금액이 들어있는 신용/체크카드를 준비하고 '결제 페이지로 이동'을 누르자 입력하고 구매버튼을 누르자 2020-03-19일 기준으로 32,720원이 청구되었다 (달러값 실화인가...) 결제가 성공적으..
ViewPager는 요렇게 생긴 놈이다. 정확히 말하자면 ViewPager를 setAdapter를 이용해 fragment를 집어넣어서 만든다. 그런데, ViewPager는 현재 선택된 Fragment의 상태만 유지하고 나머지는 버린다. 이게 무슨말이냐 하면, SampleFragment의 onCreate에서 "created"라는 토스트 메시지를 띄우게 하고 이 SampleFragment를 페이저에 집어넣으면 페이지가 바뀔 때 마다, "created"라는 메시지가 발생한다. 이게 뭐지? 라는 생각을 할 수도 있지만, 페이저가 있다고 해서 모든 유저가 전체 페이지를 다 사용하는 것도 아닐테고, 일반적으로 이미 사용이 끝난 페이지의 상태를 저장할 필요가 없기 때문에 기본적으로 상태 유지를 하는 페이지의 수는 1..