본문 바로가기

프로그래밍24

RecyclerView의 ViewHolder가 wrap_content만 적용될 때 분명 RecyclerView도 math_parent, ViewHolder의 xml도 math_parent로 만들었는데, 빌드해보면 ViewHolder가 자꾸 wrap_content로 적용되는 이슈가 있었다. LayoutInspector를 돌려봐도 wrap_content로 나온다. width 값을 고정 dp로 줘봐도 여전히 똑같고 이래저래 할 수 있는건 다 해봤는데 달라지지 않아서 혹시 ViewHolder를 Inflate할 때 주는 옵션같은게 있나? 해서 찾아보았더니, LayoutInflater를 잘못 쓰고 있었다. 공식 문서에서 가져온 LayoutInflater의 inflate 함수이다. 설명은 간단하게 인자값으로 넣은 xml으로 새로운 뷰 계층을 만들어준다. 인자값은 resource, root, att.. 2020. 12. 19.
Kotlin Coroutine 101 영상 번역 및 요약 youtu.be/ZTDXo0-SKuU Coroutine은 어떤 문제들을 해결할 수 있는가? - 안드로이드 비동기 프로그래밍을 단순화 함. 우리가 비동기 프로그래밍을 말할 때는 동기적 프로그래밍 방식을 빼놓을 수 없다. 동기적 프로그래밍 방식으로 네트워크 콜을 메인 쓰레드에서 진행하면 onDraw() 메소드가 블럭되어서 유저는 UI Freezing 현상을 겪게 될 것. 이러한 네트워크 콜을 어떻게 메인 스레드를 블럭하지 않고 비동기적으로 만들 수 있을까? 답은 콜백 방식이 있을 수 있다. (Retrofit의 enqueue) 콜백의 경우, 네트워크 콜을 다른 쓰레드에서 돌릴 수 있게 되어 메인 쓰레드를 블럭하지 않으므로 onDraw()가 잘 호출이 되고, 호출이 끝나면 콜백 함수에서 람다 구문을 실행시켜 U.. 2020. 11. 26.
코틀린이란 코틀린 vs 자바 간결한 문법 세미콜론을 넣지 않아도 된다. 객체를 생성할 때 new 키워들르 사용하지 않는다. 타입 추론을 지원하므로 일반적인 경우 타입을 명시하지 않아도 된다. //타입을 항상 명시해 주어야 한다. String name = "KnowRe"; //객체 생성 시 new키워드를 사용합니다. Person person = new Person(name); //타입을 적지 않아도 타입 추론을 통해 String 타입으로 지정합니다. val name = "KnowRe" //객체 생성 시 new 키워드를 사용하지 않는다! val person = Person(name) 널 안정성(Null Safety) 자바에서는 객체가 null을 허용하는지의 여부를 따로 구분하지 않는다. 코틀린에서는 컴파일 단계에서 객.. 2019. 7. 23.
익명 클래스(Anonymous Class) 정의 InnerClass의 한 종류로 이름이 없는 객체를 만들 수 있다. 익명 클래스를 사용하는 가장 큰 목적은 부모 클래스를 상속받는 서브 클래스를 생성하지 않고도, 단일 객체를 만들어서 부모 클래스에 정의된 동작에서 행위를 추가할 수 있다는 것이다. 익명 클래스는 그래픽 프로그래밍을 할 때 리스너 인터페이스를 만들 때 유용하다. 익명 클래스는 클래스와 인터페이스로부터 만들 수 있다. 익명 클래스를 사용하지 않은 예제 interface Age { int age = 29; void getAge(); } class MyClass implements Age { @Override public void getAge() { System.out.print("Age is "+age); } } class Anonymo.. 2019. 7. 21.
안드로이드 서비스 (2) Started Service시작된 서비스란 다른 구성요소가 startService()로 서비스를 호출하고, 서비스는 onStatCommand()에서 백그라운드 작업을 수행하는것을 말한다. 서비스가 시작되면 서비스만의 생애주기를 가지며, 백그라운드 작업은 무기한 실행될 수 있다. 해당 서비스를 호출한 구성요소가 소멸되어도 무관하며, 서비스를 종료시킬 때는 stopSelf()를 호출하여 종료시키거나 다른 구성요소가 stopService()를 호출하여 종료시킬 수 있다. 어플리케이션의 구성요소(액티비티)가 서비스를 시작하면서 intent를 전달하여 데이터를 전달할 수 있다. 서비스는 onStartCommand()에서 수신받는다. 시작된 서비스는 Service와 IntentService 두 가지 클래스를 확장하.. 2019. 2. 18.
안드로이드 서비스 (1) 서비스서비스는 백그라운드에서 오래 실행되는 작업을 수행하는 애플리케이션 구성요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 구성요소(액티비티 같은)가 서비스를 시작할 수 있으며 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행된다. 이 외에도 앱의 구성요소를 서비스에 바인드하여 상호작용 할 수 있다. 서비스의 예로는 네트워크 트랜잭션을 처리하고, 음악을 재생하고, I/O를 처리하며 ContentsProvider와 상호작용할 수 있고 이 모든 작업을 백그라운드에서 실행할 수 있다. 서비스는 두 가지 형태가 있다. -시작됨애플리케이션의 구성요소(예:액티비티)가 startService()를 호출하여 서비스를 시작한다. 서비스는 한 번 시작되면 백그라운드에서 무기한 실행될 수 있으며, 호출한 구성요소가.. 2019. 2. 18.
액티비티 재생성 액티비티 재생성 정상적인 앱 동작으로 인해 액티비티가 정지되는 경우를 알아보자. 사용자가 Back버튼을 누르는 경우액티비티가 finish()를 호출하여 자체적으로 종료하는 경우액티비티가 전면에서 오랬동안 사용되지 않는 경우전면에 있는 액티비티가 많은 리소스를 필요로 하여 백그라운드 프로세스를 종료할 때 앞의 두 경우는 더 이상 액티비티가 필요하지 않다는 사용자의 의지가 명확하므로 시스템에서 더 인스턴스를 유지하지 않는다. 그러나 시스템에 의해 강제로 소멸한 경우 시스템은 액티비티 인스턴스를 기억한다. Bundle 객체의 '키-값' 쌍의 컬렉션에 이러한 정보가 저장된다.*액티비티가 화면을 회전할 때마다 액티비티는 완전히 소멸된 후 다시 생성된다. 이유는 화면 구성이 바뀌어 레이아웃의 대체 리소스를 로딩해야.. 2019. 2. 16.
안드로이드 액티비티 생명주기 안드로이드 액티비티의 수명주기 콜백의 이해 액티비티 인스턴스가 살아있는동안 안드로이드는 계단식 피라미드와 비슷하게 각 생명주기에 해당하는 메소드를 호출한다. 새로운 액티비티가 생성되면 안드로이드는 액티비티의 생명주기를 점차 상향으로 이동시켜서 resumed에서는 사용자와 상호작용 할 수 있는 상태가 된다. 액티비티가 소멸될 때 피라미드에서 점차 내려오기 위해 해당 메소드를 호출하게 되며, 경우에 따라 완전히 하향 이동되지 않고 기다린다. (사용자가 다른 앱으로 전환했거나) 이런 경우 액티비티는 다시 피라미드의 최상향으로 이동할 수 있다.(다시 원래 액티비티로 돌아간 경우) 액티비티의 수명주기를 올바르게 구현하면, 다음을 포함하여 여러가지 상황에서도 앱이 제대로 동작하는것을 보장할 수 있다.사용자가 앱을 .. 2019. 2. 16.
String vs StringBuffer vs StringBuilder 기술면접을 볼 때 만약 지원자가 Java언어를 할 줄 안다면, 빠지지 않고 나오는 단골 문제인것 같다. 이 참에 정리해준다. 1.String -String instance는 character의 배열이며, immutable하기 때문에 생성이 되고 나면 변경할 수 없다. '+'를 써서 변경하는 경우는 다시 생성하는것이다. 2.StringBuffer -멀티 쓰레드 환경에서 사용할 수 있으며, String과 같지만 변경이 가능한 character의 배열 모음이다. -StringBuffer의 메소드들은 synchronized 되어있으며 이로 인해 멀티 쓰레드 환경에서 safe하다.-JDK5에서는 StringBuffer와 똑같이 동작하지만 Single Thread에 더 적합한 StringBuilder가 생겼다. s.. 2019. 2. 16.
안드로이드 Notification 애플리케이션에 특정 이벤트(문자 메세지 도착이나 SD카드를 꽃았을 때)가 왔을때 사용자에게 그 사실을 인지시켜주어야 한다. Notification은 화면 상단바에 표시되며, 해당 Notification을 확인하고 지우기 전까지는 계속 상단바 리스트에 남아있고 클릭하면 원하는 컴포넌트를 호출할 수 있다. Notification을 사용하기 위해서는 크게 3가지를 구성해야 한다.TickerText(상태 표시줄에 표시되는 텍스트와 이미지)Notification List에 표시되는 항목 Notification List에서 항목을 눌렀을 때 수행할 작업 Notification 객체 생성하기Notification 객체를 생성하면서 상태 표시줄에 표시되는 문자 및 아이콘 이미지를 생성자로서 넣어준다. Notificat.. 2018. 12. 7.
dp/dip/sp/px 단위와 멀티해상도 안드로이드는 다양항 스마트폰의 해상도를 지원하므로 개발할 때 멀티해상도를 신경써야 한다. 스크린의 실제 단위 PX P는 화면을 구성하는 최소 단위이다. PX는 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절대적 표시 단위이므로 안드로이드에서는 PX보다는 DP단위를 써야한다. DPIDot Per Inch의 줄인말로, 1인치에 들어가는 픽셀을 나타내는 단위이다. 안드로이드의 기본 단위는 mdpi : 160dpi 이다. 잠깐 살펴보자ldpi : 120dpimdpi : 160dpi(기본) 픽셀과 dp의 대응이 1:1이다. 즉 1dp는 1px가 된다.hdpi : 240dpixhdpi : 320dpixxhdpi : 480dpixxxhdpi : 640dpi 다양한 디바이스 크기에 대응하기 위해 필요한 .. 2018. 12. 7.
안드로이드 Firebase Auth / Realtime Databsae Firebase Auth는 사용자 인증에 관한 좋은 솔루션이다. 대부분의 앱에서는 사용자의 신원 정보를 필요로 한다. 사용자의 신원이 일단 확인되면, 사용자의 데이터를 클라우드에 저장할 수 있고 사용자의 모든 디바이스에서 사용자에게 맞춘 동일한 경험을 제공할 수 있기 때문이다. Firebase는 앱에서 인증에 필요한 SDK , 백엔드 , 인기 인증 업체에 대한 인증이 지원된다. 또한 Firebase 인증을 통해 다른 Firebase 서비스와 연동이 가능하며 OAuth 2.0 같은 산업 표준을 활용하므로 맞춤 백엔드와 쉽게 통합할 수 있다.1)오픈소스 형태로 제공하는 Firebase Auth UI를 삽입하거나2)Google, Facebook , Github같은 인증업체의 sdk를 통해 인증을 구현한다. 작.. 2018. 12. 6.
안드로이드의 구조 - MVC , MVP , MVVM 안드로이드를 처음 접할때 보통 액티비티에 안에 모든 작업을 수행하도록 코드를 짜는 경우가 많을것이다.가령, 액티비티 내에서 버튼 클릭 이벤트를 만들고, 해당 이벤트안에서 UI변경이나 데이터를 가져와서 넣어주거나 갱신된 데이터를 UI에 표현까지 모두 하나의 액티비티 안에 있는 경우이다. (반성한다.) 당연히 이렇게 코드를 짜다보면 서버와의 통신 부분이 추가되거나, 점차 기능이 추가될수록 가독성도 떨어지고 유지보수가 힘들어지는 코드로 가게 된다. 점점 화면이 복잡해지고 view에 의해 제어되는 로직들이 많아짐에 따라서 이를 분리하려는 노력들이 계속 진행되어왔다 MVC웹 서비스 개발자들이 가장 먼저 접하는 패턴일 것이다.Model : 데이터를 다루는 영역이다. 비지니스 로직이 들어있고, 네트워크, 데이터베이스.. 2018. 12. 6.
안드로이드 방향 전환 안드로이드 액티비티는 고유의 생애주기를 가지고 있다.안드로이드의 화면 방향이 전환이 되면 액티비티는 소멸되었다가 다시 생성되게 된다. 화면이 전환될 때 콜백 메소드의 호출 순서를 살펴보면1.onSavedInstanceState() - 현재 액티비티 상태 저장(EditText에 입력중인 텍스트 같은)2.onPause()3.onStop()4.onDestroy()5.onStart()6.onRestoreInstanceStae() - 액티비티 상태 복구7.onResume() 액티비티의 방향이 전환될 때 방향 변화에 대응할 수 있도록 해주는 속성을 같이 정의해주면, 방향이 변하더라도 액티비티가 소멸되지 않는다. 대신에 onConfigurationChanged(Configuration) 메소드가 호출되면서 환경이 바.. 2018. 12. 6.
안드로이드 컴포넌트 안드로이드 어플리케이션은 어떤 구조를 가지고 있는지 살펴보자. 안드로이드 구조는 사용자가 눈으로 보면서 상호작용을 하는 컴포넌트 - Activity , Notification이 있고, 눈에 보이지 않거나 백그라운드에서 실행되는 컴포넌트 - Broadcast Receiver, Content Provider, Service가 있다.intent와 notification은 안드로이드의 컴포넌트라고는 할 수 없지만 매우 밀접한 연관이 있으므로 같이 다룬다. 애플리케이션은 이들 컴포넌트의 여러 구성요소로 이루어져 있고 이들을 서로 호출하기 위해서는 intent를 사용한다. Activity액티비티는 애플리케이션의 한 화면을 뜻한다. 또한 실제 사용자와 소통하여 상호작용하는 컴포넌트이다. 안드로이드는 메모리 관리를 위.. 2018. 12. 6.
안드로이드 AlaramManager 안드로이드 백그라운드 작업먼저 첫번째 분류로서 처리하는 작업의 실행 시점에 따라서 1)당장 실행되어야 하거나2)설정한 조건에 맞으면 실행이 되거나로 나눌 수 있다. 두번째 분류는 작업의 결과가1)항상 작업이 실행이 되어야 한다.2)경우에 따라서 실행이 되지 않을 수 있다. 두 가지 기준에 따라서 사분면으로 나눌 수 있다.상황에 따라서 적절한 백그라운드 작업을 실행해야 한다. 초기에 안드로이드의 백그라운드 작업은 어렵지 않았다. 개발자는 필요에 따라 브로드캐스트 리시버로 앱을 깨우는 것도 가능했고 iOS와 대비되는 차이점이기도 했다. 그러나 장점이 높은만큼 앱들이 각자 백그라운드 작업을 돌린다면 안드로이드의 한정된 메모리와 CPU자원을 소모하게 되고, 안드로이드는 리눅스 커널과 다르게 스왑 공간이 없고 O.. 2018. 12. 5.
자바의 NIO 기존의 자바I/O 는 느리다는 편견이 존재했다. Blocking 방식 때문이었을까. FileReaderPrintReaderFileWriterPrintWriter위와 같은 클래스는 쓰기 어려움은 없이 I/O 작업은 할 수 있었지만, 커널 버퍼를 직접 접근하는 Direct Buffer를 핸들링 할 수 없었다. 소켓이나 파일에서 Stream이 들어오면 커널 버퍼에 쓰여지게 되는데, 자바 코드에서 이를 접근할 수가 없었기 때문. 커널에서 JVM 내부로 옮겨와야 하는 오버헤드로 인해 속도 이슈가 있었다. 세부적인 이유는JVM 내부로 복사할 때 CPU 사용(디스크에서 커널버퍼로 복사하는 과정은 CPU가 하지 않고 DMA가 해준다.) 복사 Buffer 사용 후 GC를 통해 정리(GC의 대상이 된다.)쓰레드 Block.. 2018. 12. 5.
Android Material CalendarView 안드로이드에서 제공하는 기본 캘린더는 날짜를 다중 선택할 수가 없고, custom 하기에는 제한적이다. Material CalendarView 오픈소스 라이브러리를 활용해보자. https://github.com/prolificinteractive/material-calendarview 위 주소에서 사용방법을 볼 수 있다. 프로젝트에 적용해서 활용했던 기능은 다음과 같다. widget = findViewById(R.id.calendar_access_search); widget.setCurrentDate(new Date(System.currentTimeMillis())); widget.setDateSelected(new Date(System.currentTimeMillis()), false); widget... 2018. 12. 5.