- ViewHolder : view들을 보관하기 위한 객체 ( ListView, RecyclerView ) - ViewHolder 장점 리스트의 아이템들 내의 view들을 접근하기 위해서는 findViewById를 매번 호출해야 한다. 즉 동일한 작업을 진행하는데 findViewById를 이용하여 매번 xml의 view 태그를 접근해야한다. 이는 아이템이 많아질수록 성능 저하로 연결되는 요인이 된다. 따라서 이를 해결하기 위해, Holder 패턴을 적용한 ViewHolder를 이용한다. ViewHolder를 이용하여, 아이템의 각 view 태그를 저장하고, 아이템의 view를 접근할 때마다 Holder가 저장한 태그를 이용한다. 이렇게 되면 findViewById 의 함수 호출이 적기 때문에 성능 향상에..
UI 변경 작업은 UI Thread에서만 가능하다. 따라서, 기본적인 백그라운드 작업 시 사용하는 Thread에서는 UI 변경작업을 할 수 없다. 백그라운드 작업 시 UI 변경작업을 진행하기 위해서는 백그라운드에서 작업 중인 데이터를 UI Thread에 전달해줘야 하는데 이러한 전달 역할을 Handler가 해준다. 1.Handler 객체를 UI Thread(Main Thread) 에서 생성하고, 생성한 Handler 객체를 이용하여 백그라운드로 작업할 Thread에서 Handler의 post 메소드를 이용하여 처리할 UI 로직을 Runnable 로 실행시킨다. MainActivity { Handler handler = new Handler(); MyThread extends Thread{ Thread()..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cPWXwS/btqErK6wulI/Ail7zoMPoULXmI9xkN9w3K/img.png)
https://developer.android.com/guide/components/intents-filters?hl=ko#PendingIntent * Intent : 시스템에서 안드로이드 구성요소에 데이터를 전달하기 위한 메시지 역할 수행 Intent를 전달받는 구성요소 - Activity : 앱 안의 단일화면으로써, Intent를 통해 Activity를 시작할 수 있음. ( startActivity, startActivityForResult ) - Service : 사용자와의 인터페이스 없이 백그라운드 작업을 수행하는 요소로써, Intent를 통해 Service를 시작할 수 있음 ( API 21 이하 : Service 클래스로 서비스 시작 , API 21 이상 : JobScheduler로 서비스 시작..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/0jn8F/btqEgQylhQ9/nk2ucsplVaD7DpK6X1i7D1/img.png)
RecyclerView 를 구현하면서 데이터 변경사항을 알리기 위해, notifyDataSetChanged(); 를 호출한다. 근데, 이 함수는 데이터셋의 변경된 일부분에 대한 업데이트가 아닌, 데이터셋 전체를 새로운 리스트에 리로드한다. 즉, 변경할 때마다 새로운 리스트에 전체를 리로드한다는 것이며, 성능에 문제가 발생할 수 있다는 말이다. 물론, notifyDatSetChanged()가 아닌 notifyItemChanged(int), notifyItemInserted(int) ... 등의 함수를 사용하여 해결해도 된다. 그러나, 변경된 아이템의 위치정보를 알고 있어야 하고, 데이터 변경의 오퍼레이션(insert, remove, update.. )도 알고 있어야 하는 까다로움(?)이 있다. 그러니.....
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bjGgT2/btqEcToLMrC/rXR2yCFSzgfOB3T1vIohV1/img.png)
MainActivity에서 ViewModel 클래스에 대한 인스턴스를 생성하는 과정에서 "Cannot create an instance of class ~viewmodel" 에러가 발생. YouTube 보고 따라하다가 발생한건데... 에러에서 보면 "~ has no zero argument constructor" 라고 표시되어 있음. 즉, 파라미터가 없는 생성자가 viewmodel 에 없기 때문에 인스턴스가 생성될 수 없다는 것을 알 수 있음. 그러나, 내가 생성하고자 하는 ViewModel 인스턴스는 Application 이라는 파라미터를 받아야 하므로.... ViewModelFactory를 따로 생성해줘서 해결하였다.
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/oy9n0/btqDrkUordO/Ql4skSvy1wQkvgKTcjsRik/img.png)
배경 : 개발 시 사용했던 log를 release 버전에서는 로그가 찍히지 않도록 변경하였다. 변경 후, 이 부분을 테스트하기 위해 개발과정에서 release 버전으로 앱을 실행시켜야 했다. 방법 : release 버전에 사용할 keystore 를 생성 생성한 keystore 파일을 android studio의 app 폴더에 지정 app 폴더의 builde.gradle 에서 앱이 release 버전으로 실행 해당 keystore를 이용해 앱을 실행시키도록 함 ( 참고로, build.gradle 파일에 직접 keystore 의 민감한 정보를 포함하기 때문에 property 파일에 따로 작성하고 이를 불러서 사용하도록 하는 방법이 있음... 참고 url : https://developer.android.co..
안드로이드 앱 개발 중에 홈버튼에 대한 이슈가 발생함. 꺼진화면, 잠금화면에 대해 lifecycle이 2번 도는데 (API 26이하까지), 그렇다면 꺼진화면 & 잠금화면일 경우, 총 onStop이 3번 돌아야 된다고 생각한다. ( 이미 꺼진 화면 stop 한번 , 잠겼으니 stop 한번, 최종적으로 activity 꺼질 경우(activity에 대해서 꺼지는 행동만 할 수 있다는 가정하에..) stop 한번 ) ..... 그러나, 실제 run으로 확인하면 stop이 2번만 될 때도 있고, 3 번이 될 수 도 있다(심한욕...)....,,,, 그래서 아예 activity가 꺼지는 상황이 발생했을 경우에만 onDestroy 되게 끔, 수정해야 한다. 1. swipe 를 사용했을 때, 2. 홈버튼 눌렀을 때....