DataBinding, Binding 객체 생성나는 DatabindingUtil 클래스로 bindng 객체를 생성해서 사용하고 있었다. 하지만 다른 사람들이 작성한 databinding 코드들을 보면 여러 방법으로 binding 객체를 생성해주는 것을 보고 내가 제대로 쓰고 있는 것에 대한 의문이 들었다.inflate(), bind() 의 차이도 궁금하던 차였고 ..이러한 의문들을 해결하기 위해 대표적인 Activity, Fragment 에서의 사용법을 분석해보았다.ActivityActivityMainBinding.inflate(inflater: LayoutInflator)override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedI..
String API, isBlank() vs isEmpty()우린 Android 에서 java 언어로 String 의 null or empty check 를 TextUtils.isEmpty() 로 하곤 했을 것이다.코틀린에서는 String 클래스 내 API 로 isBlank() 와 isEmpty() 두 가지를 제공한다.사용 시 자주 헷갈리는 두 API 차이를 분석해보자.isBlank()fun CharSequence.isBlank(): Boolean문자열이 비어 있거나 공백 문자만으로 구성되어 있으면 true 를 리턴한다.Kotlin, isBlankisEmpty()fun CharSequence.isEmpty(): Boolean문자열이 비어있으면 true 를 리턴한다.Kotlin, isEmpty 두 API ..
getLocationOnScreen vs getLocationInWindow()두 메소드 모두 뷰의 좌표값을 얻기 위해 종종 쓰는 메소드이다.둘의 차이를 비교하기 전에 Android Developers 에서의 정의를 살펴보자.public void getLoactionInWindow(int[] outLocation)@param outLocation int : 좌표를 보유할 두 정수 배열window 에서 view 의 좌표를 계산한다. 메소드가 리턴 된 후, 배열에는 x 밑 y 위치가 순서대로 포함된다.public void getLocationOnScreen(int[] outLocation)@param outLocation int : 좌표를 보유할 두 정수 배열screen 에서 view 의 좌표를 계산한다. ..
Architecture Components 사용 시의 5가지 일반적인 실수주의 : 이 글은 원문이 존재하는 글로, 본인은 그저 번역 / 의역한 것일뿐임을 알림.원문 : https://proandroiddev.com/5-common-mistakes-when-using-architecture-components-403e9899f4cb다소 심각한 결과를 초래하는 것들 - 만약 당신이 이러한 실수들을 저지르지 않더라도, 언젠가 같은 문제에 직면하는 것을 피하기 위해 명심할 가치가 있다. 이 글을 아래의 내용들을 설명한다.Leaking LiveData observers in FragmentsReloading data after every rotationLeaking ViewModelsExposing LiveDat..
String.contains() with empty String, return truejava 에서 String.contains() 를 사용할 때 내가 발생했던 이슈에 대해 다뤄보려한다.아래의 코드를 보자.String myString1="foo"; String myString2=""; if(myString1.contains(myString2)){ System.out.println("Am here"); } else { System.out.println("Am not here"); }foo 가 "" ( empty string ) 을 포함하냐는 것인데, 언뜻 보면 false 로 "Am not here" 가 실행될 것 같지만컴파일 해보면 "Am here" 가 출력된다.그 이유를 찾아보니 모든 문자열의 시작과 끝..
Message.obtain() vs Handler.obtainMessage()Handler 에 대해 찾다가 Message 객체를 얻어오는 두 메소드를 알게 되었다.두 메소드의 차이를 보려고 Android Developers 문서를 보았는데 둘 다 Global Message Pool 의 인스턴스를 반환한다고 명시되어 있었다.무언가 다른 점이 있을것 같아 찾아본 내용들에 대해서 정리하고자 한다.Message.obtain()Android Developers 에서 찾아보면 이렇게 정의되어있다.obtainstatic fun obtain(): Message!Return a new Message instance from the global pool. Allows us to avoid allocating new obj..
Handler ( sendMessage, post ) / runOnUiThreadHandler ( sendMessage, post )runOnUiThreadReferences안드로이드에서 Thread 를 Main Thread 로 이관하는 작업 도중 문득 Handler ( sendMessage, post ) / runOnUiThread 의 차이점이 궁금해져서 찾아보았다.각각의 사용법에 대해서는 잘 정리해놓은 글들이 많이 있고 내용이 길어질 수 있으니 사용법 관련해서는 적지 않았다.Handler ( sendMessage, post )sendMessage()public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); }Ha..
DI : Dependency Injection ( 의존성 주입 )What is DI ?ReferencesWhat is DI ?의존성 주입을 이해하기 위해 의존성의 개념부터 짚고 가겠다.Dependency ( 의존성 ) ?SOLID 에서 Dependency Inversion Principle ( DIP, 의존 관계 역전 원칙 ) 을 이해하고 있다면 의존성을 이해하기 쉽다. DIP 에 대해서는 추후 포스팅 할 예정이다.DIP 는 이렇게 정의하고 있다.고차원의 모듈은 저차원의 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화 된 것에 의존해야 한다.추상화 된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화 된 것에 의존해야 한다.고수준 모듈 : 어떤 의미가 있는 단일 기능을 제공하는 모듈저..
JDK 6 이후, Timezone.setDefault() Timezone.setDefault(Timzone timezone) 은 메소드 명에서 유추할 수 있듯이 기본 Timezone 값을 설정하는 메소드이다.Timezone.getDefault() // 기본 Timezone 값 가져오기먼저 핵심부터 이야기하면, JDK 6 이전에는 defaultTimzone 이 스레드 로컬 변수에 저장되었다.하지만 JDK 6 이후로는 defaultTimezone 이 VM 전체를 변경한다고 한다.내 경우에는 JDK 6 이전의 형태로만 알고 있었기 때문에, Timezone 설정을 아래와 같이, 별도의 시간 관련 메소드 내에서 Timezone.setDefault(Timzone timezone) 을 사용하여 Timezone 설정을..
인터페이스 상수인터페이스 상수 ?인터페이스 상수는 Anti-PatternReferences인터페이스 상수 ?인터페이스 내에 선언된 변수는 무조건 public static final 로 선언 된다. class A { public static final int MON = 1; public static final int TUE = 2; public static final int WED = 3; }클래스 내의 상수 interface A { int MON = 1, TUE = 2, WED = 3; }인터페이스 내의 상수[ 출처 ] : https://codedragon.tistory.com/2526따라서 위의 두 코드는 완전히 동일한 의미이다.인페이스 상수는 Anti-Pattern처음 인터페이스 상수에 대해 검색을 ..