본문 바로가기

Native 개발29

안드로이드 - volatile 이란 무엇이고, 왜 필요할까? volatile 키워드 volatile 키워드는 Java변수를 Main Memory에 저장하겠다는 것을 명시하는 것입니다. 즉 매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것입니다. 또한 변수의 값을 Write할 때마다 Main Memory에 까지 작성하는 것입니다. 왜 필요할까? volatile 변수를 사용하고 있지 않은 MultiThread 어플리케이션에서는 Task를 수행하는 동안 성능 향상을 위해 Main Memory에서 읽은 변수 값을 CPU Cache에 저장 하게 됩니다. 만약 MultiThread환경에서 Thread가 변수 값을 가져올때 각각의 CPU Cache에 저장된 값이 다르기 때문에 변수 값 불일치 문제가 생길 수 있습니다. .. 2019. 2. 26.
프레그먼트 - 프레그먼트 생성시 데이터 전달 프레그먼트의 데이터 전달 프레그먼트 생성시에 데이터를 Bundle로 설정해서 key-value값의 데이터를 넘겨줄수 있습니다. 이를 통해 프레그먼트간 전환시나 맨 처음 생성시에 필요한 기본 값들을 setting할 수 있게 됩니다. 프레그먼트생성시 onCreate에 데이터 전달 new Instance 메소드를 통해 필요한 파라미터로 데이터를 전달합니다. 이후 newInstance안에서 Fragment를 생성하고 Bundle를 통해 데이터를 넘겨줍니다. 이 때 Fragment의 setArgument를 사용합니다. 이는 추후에 Fragment의 onCreate에서 getArgument() 메소드를 통해 호출 할 수 있습니다. 프레그먼트 액티비티 생성후 첫 프레그먼트 전환시 사용 예 위의 Fragment의 ne.. 2019. 1. 29.
안드로이드 - 핸들러와 Looper의 동작과정 Handler와 Looper의 필요성 Handler와 Looper는 안드로이드 내에서 Thread 백그라운드 처리에 사용됩니다. 위의 그림은 병렬 처리로 돌아가고 있는 Main과 Sub 쓰레드에서 textView의 setText 메서드 사용시 어떤 것을 처리할지에 대한 이미지 인데요, 이런 동기화문제를 처리하기 위해 안드로이드는 메인 스레이드에서만 UI 작업이 가능하도록 제한하였습니다. Handler와 Looper를 이용해 Sub 쓰레드에서 Main 쓰레드로 UI 처리작업을 전달하거나, Main 쓰레드 자체적으로 처리하던지 해야 합니다. Handler와 Looper의 동작과정 Handler는 단어 그대로 무언가를 처리하는 역활을 합니다. Handler는 Message와 Runnable 객체를 처리합니다... 2019. 1. 28.
안드로이드 - 키스토어 개념 / 사용법 안드로이드에서 키스토어 발급받는 방식 2가지 키 스토어를 발급받는 방법에는 2가지가 있습니다. Android Studio에서 Key Store 생성 및 앱에 서명해서 APK 추출 구글 플레이 콘솔의 기능인 구글 플레이 앱 서명 기능 ex) 앱 서명 창 방법 1 : Android Studio에서 Key Store 생성 및 앱에 서명해서 APK 추출 기존의 앱 서명 개발자가 자신이 만든 키로 안드로이드 앱을 서명하고 구글 플레이에 업로드 합니다. 이 키를 잃어버리게 되면 아무리 내 구글계정으로 올린 앱이라고 하더라고 두번다시 이 앱을 업데이트 할 수 없습니다. 같은 키로 apk 서명을 해야 하는데 할 수가 없기 때문입니다. 방법 2 : 구글 플레이 콘솔의 기능인 구글 플레이 앱 서명 기능 새로운 방식 ( 구.. 2019. 1. 9.
안드로이드 - FragmentPagerAdapter, FragmentStatePagerAdapter 를 사용하여 ViewPager사용하기 Fragment는 Adnroid 3.0 (허니콤) 부터 추가된 기능입니다. Fragment의 개념적인 설명과 실제 사용시에 대한 설명은 아래 링크를 참조하시면 좋습니다. 개념적 설명 : http://androidhuman.tistory.com/469 실 사용 설명 : http://android-developers.blogspot.com/2011/02/android-30-fragments-api.html FragmentPagerAdapter 제한된(고정된) 개수의 항목(Fragment)들에 적합합니다. 한번 생성되면 Fragment의 인스턴스를 FragmentManager에서 정대로 제거하지 않기 때문 (Activity가 종료되지 않는 한) 현재 보이지 않는 Fragment에서 View들을 detach합니.. 2019. 1. 9.
안드로이드 - 앨범 / 카메라로 사진 이미지 가져오기 (+ Crop 기능) 안드로이드에서 프로필 사진을 바꾸거나, 맛집등록어플에서 음식사진을 올릴 때 보통 카메라나 앨범에서 이미지를 가져와서 올리는데요, 이를 코드상에서 어떻게 구현할수 있을지 한번 정리해봤습니다.! 기본작업 1. 상수를 선언한다. 기본적으로 4가지 상수를 선언합니다. 2. 갤러리, 및 사진촬영 버튼을 눌렀을 때 해당 동작을 수행하는 버튼 이벤트를 선언합니다. getImageFromAlbum getImageFromCamera 3 getImageFromAlbum : 앨범에서 사진 이미지 가져오기 생성자 변수로 Intent.ACTION_PICK을 넣어 Intent 객체를 생성합니다. MediaStore.Image.Media.CONTENT_TYPE 를 타입으로 설정합니다. 이후 인텐트를 수행합니다. 4. getImag.. 2018. 12. 14.
안드로이드 - compilesdkversion minsdkversion targetsdkversion buildtoolsversion 보통 이런 문제가 발생하게되면 compilesdkversion, minsdkversion 등을 확인해보게 됩니다. 그렇지만 잘 알고 쓴적은 없어서 이번기회에 한번 정리해보겠습니다. compileSdkVersion compileSdkVersion으로 gradle에 어떤 안드로이드 SDK 버전으로 앱을 컴파일 할지 알려줍니다. 컴파일 시에만 적용되므로 runtime동안에는 영향을 미치지 않습니다. 항상 최신 버전의 SDK로 지정하는 것이 좋습니다. 해당 버전에 포함된 API를 사용할 수 있다는 것을 의미합니다.import문으로참조되는 클래스나 메소드를 찾을 때 어떤 버전의 SDK에서 찾을 것인가를 결정해줍니다. 예를 들어 아래와 같은 경우를 보겠습니다. 맨 처음 첨부한 스크린샷에서 빨간줄은 현재 compil.. 2018. 12. 12.
안드로이드 - 자신의 앱의 아이콘 변경하기 안드로이드의 앱의 아이콘 변경 안드로이드에서 제공하는 기본 앱 아이콘은 안드로이드 얼굴 모양이지만, 사용자 특성에 맞게 앱 아이콘을 변경 할 수 있습니다. 아이콘을 /res 디렉터리에 mipmap 디렉터리에 넣으면 됩니다. 그런데 mipmap 디렉터리는 해상도에 따라 여러개의 디렉터리로 구성되어 있으므로, 각각에 디렉터리에 있는 ic_launcher.png 크기에 맞게 아이콘을 변경에서 넣어야 다양한 안드로이드 기기에서 제대로 보이게 됩니다. 해상도별 런처 아이콘 크기 정리 해상도 크기 mdpi 48px * 48px hdpi 72px * 72px xhdpi 96px * 96px xxhdpi 144px * 144px xxxhdpi 192px * 192px 런쳐 아이콘 쉽게 만들기 앱을 설치했을 때 바탕화면.. 2018. 11. 20.
Functional Reactive Programming - 개념 정리 Observable이란? Observable 이란 데이터의 흐름을 관리하기 위한 패턴입니다. Observable은 데이터의 흐름에 맞게 알림을 보내 구독자가 데이터 처리를 할 수 있도록 만드는 역활을 합니다. 보통 Observable은 3가지의 상태를 알려줍니다. 데이터의 발행 (onNext)모든 데이터의 발행의 완료 (onComplete)에러 발생 (onError) Subscriber란? 데이터의 흐름을 구독한다는 의미입니다. 위의 onNext, onError, onComplete에 대한 리스너를 설정하고 3개의 이벤트에 대한 로직을 만들고 수행합니다. 예제) 아이템을 소비하는 코드 *ex ) Hello World Observable로 구현하기 Observable myObservable=Observab.. 2018. 8. 1.