우선 Choreographer의 기본 방식을 모르는 독자는 다음의 링크를 보고 오기를 바란다. 기본적인 내용과 Java코드가 있다. jamssoft.tistory.com/231 안드로이드 Choreographer 사용하기 인스턴스 생성하기 Choreographer는 new를 통해 생성할 수도 없고, 다른 방법으로 만들어야 한다. Choreographer choreographer = Choreographer.getInstance(); 위와 같이 static함수를 호출하는 것으로 끝난다... jamssoft.tistory.com Native에서 Choreographer를 사용하려면 Api Level이 24(Nougat/누가)이상이 되어야 한다. 따라서 아직 누가 미만의 기기들이 많은 관계로 되도록이면 Jav..

인스턴스 생성하기 Choreographer는 new를 통해 생성할 수도 없고, 다른 방법으로 만들어야 한다. Choreographer choreographer = Choreographer.getInstance(); 위와 같이 static함수를 호출하는 것으로 끝난다. 어짜피 화면에 그려지는 시간이라는 것은 정해진 거라 한 개만 있으면 충분하기 때문에 singleton방식으로 동작하게 만들어 두었고, 따라서 공유되는 자원이라 필요가 없어져도 일부러 삭제할 필요도 없다. 물론 최소한의 메모리는 차지하기 때문에 다음과 같이 하는 것으로 삭제작업을 하면 된다. choregrapher = null; Choreographer는 Looper를 이용하기 때문에 "Choreographer.getInstance()"를 호..
Java : Build.VERSION.SDK_INT NDK : int android_get_device_api_level() Android Version Table Version API Build.VERSION_CODES Name 커널 Exposed 1.0 1 BASE 2008/10 1.1 2 BASE_1_1 2009/2 1.5 3 CUPCAKE CupCake 2.6.27 2009/5 1.6 4 DONUT Donut 2.6.27 2009/9 2 5 ECLAIR Eclair 2.6.29 2009/10 2.0.1 6 ECLAIR_0_1 2.6.29 2009/12 2.1 7 ECLAIR_MR1 2.6.29 2010/1 2.2 8 FROYO Froyo 2.6.32 2020/6 2.3~2.3.2 9 GINGERB..

Single Thread에서 작업을 할 경우, 이 FenceSync라는 녀석은 필요가 없다. 하지만 이전에 포스트했던 shared Context를 사용할 경우 문제가 발생할 수 있다. 다음의 시나리오를 통해 발생할 수 있는 상황을 연출해보자. 이 전에 OpenGLES를 멀티 쓰레드로 사용하는 방법은 다음의 링크를 이용하기 바란다. jamssoft.tistory.com/227 안드로이드 NDK OpenGLES 초기화 및 Shared Context OpenGLES 초기화는 자주하는 작업은 아니지만, 다시 하려고 하면 어떻게 하는지 까먹는 작업이라 이렇게 정리를 해둔다. NDK로 코드가 작성되었으며, 이게 우끼게도 Java는 다른 식으로 작성해야 문 jamssoft.tistory.com Thread B에서 t..

OpenGLES 초기화는 자주하는 작업은 아니지만, 다시 하려고 하면 어떻게 하는지 까먹는 작업이라 이렇게 정리를 해둔다. NDK로 코드가 작성되었으며, 이게 우끼게도 Java는 다른 식으로 작성해야 문제가 없다. 초기화 순서 1. eglInitialize 2. eglBindAPI 3. eglChooseConfig 4. eglCreate(Window 또는 Pbuffer)Surface 5. eglCreateContext 6. eglMakeCurrent 초기화는 다음의 순서로 진행한다. 순서가 바뀔 수도 있지만, 필자가 가진 모든 기기에서 위 순서를 사용할 경우 문제 없이 잘 초기화가 되었다. 그리고, 아래의 설명은 필자가 그냥 경험으로 터득?한 것이라 틀린 부분이 많을 수 있다. 어짜피 초기화만 끝나면 신..
Java의 stream은 워낙 쓸일이 많기에 이런 저런 stream들이 많다. 그 중 byte[]와 가장 관련이 많은 ByteBuffer를 stream으로 변환을 하려면 InputStream, OutputStream의 몇가지 함수만 Override하면 사용할 수가 있다. 그리 어렵지도 않은 작업일 줄이라..(Java의 Stream을 필자는 너무 싫어해서..) OutputStream import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; public class ByteBufferOutputStream extends OutputStream { private ByteBuffer mBuffer; public Byte..

쓰레드를 생성 후 만들어진 쓰레드를 CPU의 특정 코어로 이동할 수 있다. 필자가 알기로는 쓰레드를 생성하면서 코어를 지정하는 방법은 없는 것으로 알고 있다. 따라서, 쓰레드를 만들고 만들어진 쓰레드를 특정 코어로 이동시키는 방식으로 사용해야 한다. 일단 이 작업을 하기 위해서는 NDK를 이용해야 한다. Java파트에서 지원하는 지는 모르겠지만, 지원하지 않는다는 가정하고 이 글을 작성한다. 안드로이드도 리눅스 커널을 사용하기 때문에 리눅스와 대부분 사용법이 동일하다. 이 작업을 하기위해서는 사전작업이 좀 필요한 데, 일단 시스템내에 core가 몇 개나 있는 지 알아야 하고, 어떤 녀석이 Big코어인지, Little코어인지도 구분을 해야 한다. 또한 현재 쓰레드가 어느 core에 할당되어 있는 지도 알아..

byte[]를 String으로 byte[] => String String s = new String(b, "UTF_8"); // b => byte[] String => byte[] String str = "한글"; byte[] bin = str.getBytes( "UTF-8" ); 넘길/넘어온 데이터에 따라 'UTF-8' or 'EUC-KR'을 넣어주면 된다. 이건 검색하면 쉽게 찾을 수 있다. 근데... 만약에 byte[]를 String으로 변환하는 과정에서 byte[]의 크기가 무지막지하게 크다면, 위의 방법은 그래 좋은 방법이 아니다. 사실상 텍스트 데이터는 그리 크지 않기에 그냥 처리해 위와 같이 처리하면 웬만하면 다 처리할 수 있다. 다시 하지만, 큰 데이터를 안 다룰 경우가 없지 않다는 것이 ..
소스코드 ByteBuffer, IntBuffer, FloatBuffer, DoubleBuffer, ShortBuffer, LongBuffer, CharBuffer.. 등에는 flip, compact, clear등에 함수가 있다. 근데, 이 flip, compact, clear는 도대체가 뭐 하는 녀석인지.. 알기가 어렵다. 답은 개발자 식으로 말하면 Producer-Consumer방식을 사용하기 위해 있는 것이다. 이 Buffer들은 읽기모드와 쓰기모드가 있다. 현재상태에 따라 해야하는 작업이 정해진다. 읽기모드일 경우는 말 그대로 읽기명령(get함수등)등을 써야 하며, 쓰기모드에서는 쓰기명령(put함수 등)으로 Buffer에 작업을 하면 된다. 예로 이해하기 아주 간단한 예를 들어보겠다. Buffer에..
1. 안드로이드 http 다운로드하기( HttpURLConnection + SSL ) 2. 안드로이드 HttpUrlConnection 서버로 전송 #1 (기본편, x-www-form-urlencoded ) 3. 안드로이드 HttpUrlConnection 서버로 전송 #2 ( multipart/form-data ) multipart/form-data 1편에서 application/x-www-form-urlencoded방식을 설명했다. 이 방식의 가장 큰 문제 파일을 전송할 수 없다는 것이다. 파일을 전송하기위해서는multipart/form-data방식을 써야 한다. 이 방식의 전송데이터는 다음과 같이 생겼다. POST /test HTTP/1.1 Host: foo.example Content-Type: mu..

1. 안드로이드 http 다운로드하기( HttpURLConnection + SSL ) 2. 안드로이드 HttpUrlConnection 서버로 전송 #1 (기본편, x-www-form-urlencoded ) 3. 안드로이드 HttpUrlConnection 서버로 전송 #2 ( multipart/form-data ) 서버에 데이터를 전송하려면 기본적으로 "application/x-www-form-urlencoded" 방식을 쓴다. x-www-form-urlencoded의 구조는 다음과 같이 생겼다. 이름2=값1&이름2=값2&이름3=값3&이름4=값4 이름과 값이 한쌍을 이루며, 쌍을 분리하는 것은 '&', 이름과 값을 분리하는 것은 '='로 구분되어지게 된다. 여기서 이름과 값 모두 UrlEncoded라는 형..
1. 안드로이드 http 다운로드하기( HttpURLConnection + SSL ) 2. 안드로이드 HttpUrlConnection 서버로 전송 #1 (기본편, x-www-form-urlencoded ) 3. 안드로이드 HttpUrlConnection 서버로 전송 #2 ( multipart/form-data ) 목차 1. 서론 2. 준비사항 3. 파일로 다운로드 4. Self-Signed 인증서 5. String으로 받기 서론 안드로이드에서 web의 파일 등을 다운로드하려면 DownloadManager를 쓰면 쉽게 되지만 문제는 알림이 뜨게 된다. 여러 개를 다운로드하면 정신이 없을 정도다. 그냥 프로그램상에서 받았으면 할 경우가 있는 데, 이 때 사용할 것이 바로 HttpURLConnection이다...
GLSurfaceView안드로이드는 OpenGLES을 사용할 수 있는 방법 중에 간단하면서도 쓸만한 GLSurfaceView를 지원해 주고 있다.속도가 빠른 장점이 있다. 정확히 TextureView를 이용한 것 보다는 빠른 것 같다. GLSurfaceView는 화면을 그리는 코드가 Render Thread로 분리되어 실행되기 때문에 MainThread에 주는 무리를 줄일 수 있고, 분리된 Thread로 인해 빠르게 화면을 그릴 수가 있다. 기본 사용법1. AndroidManifest.xml설정2. 초기화 및 Renderer지정3. onPause/onResume 1. AndroidManifest.xml 설정 일단 OpenGLES를 사용한다는 것을 알려야 하기 때문에 AndroidManifest.xml파일..
wait(), notify(), notifyAll() 스레드간에 서로 변수를 동시에 바꿔 발생하는 문제는 지난 글의 내용이고 이제 쓰레드간의 정보의 전달을 위해 사용하는 방법을 배워보자, 정확히 주로 정보의 전달에 사용하기 위한 방법으로 사용되는 방식일 뿐, 정보를 전달하는 것은 아니다. 쓰레드A에서 변수의 값을 변경했다면, 쓰레드B에서 변경되었다는 신호를 인지하여 변경한 값을 가져오는 방식에 대부분 사용되기 때문에 이런 설명을 달았다. 다른 용도로도 당연히 쓸 수 있으니... 세개의 함수가 있는 데, 이는 전부 Java의 Object객체에 달려있는 메소드이다. 따라서 객체로 되어있는(Object에서 상속받은) 모든 객체는 이 함수를 쓸 수 있다. 일단 이 함수가 어떻게 동작하는 지 설명할테니, 천천히 ..
이미 이 주제로 수많은 글들이 있지만,..... 나도 그냥 한번 정리를 해본다. 일단 동기화라는 말부터 설명을 해야 되는데(대체 누가 이름을 이[따구]로 지어서 헤깔게 하는지), [동기]의 반대말은 [비동기]라는 표현을 쓴다(이름이 이따구니..원..). 워낙 자주 사용되는 표현이라 적응이 되면 어렵지 않지만, 처음 접할 때는 서로 해깔리는 문제다. Synchronization의 뜻은 "조화"다. 따라서 비동기는 "조화롭지 못하다"라는 뜻이 되고, 쓰레드에 적용해 다시 정리하면, 비동기 : 쓰레드가 다른 쓰레드에 신경 쓰지않고 그냥 자기 할일만 한다.동기 : 쓰레드가 작업이 다른 쓰레드와 조화롭게 동작한다.(다른 쓰레드가 관여할 경우 자신의 실행을 잠시 멈춘다.) 라는 뜻이다. 멀티쓰레드로 프로그래밍을 할..
이전편에서 언급한 Bitmap를 재사용하려면 사용하지 않는 비트맵을 담아 둘 Pool이 필요하게 된다. 이번편에서는 이 풀(pool)을 만들어 보기로 하겠다. 원리는 간단하다. 사용하지 않는 Bitmap을 리스트에 넣어두고 이미지를 로드할 때, 크기가 맞는 녀석을 골라서 다시 내어주면 된다. 약간의 효율을 위해 리스트는 Bitmap의 ByteSize를 기준으로 정렬을 해두도록 한다. 멤버변수들 다음은 만들 클래스의 멤버변수들과 컨스트럭터이다. public class SimpleLruBitmapPool { private static final String TAG = "SimpleLruBitmapPool"; // Pool에 들어올수 있는 최대 크기 private int mMaxByteSize; // 현재 비..
여기서의 재사용은 recycle을 말하는 것이 아니고,이미 존재하는 Bitmap변수에 이미지를 가지고 오는 방법을 설명한다. BitmapFactory.decode* 함수들을 이용할 때, 이미 메모리상에 존재하는 Bitmap에 이미지를 로드할 수 있다. 이렇게 하면 다음과 같은 장점이 존재하게 된다. 장점 비트맵메모리를 필요한 만큼 할당이 되어 있다면, 할당/해제 과정이 사라지게되고, 이로인해 GC에 의해 순간순간 멈추는 현상이 줄어들게 된다. 이미 존재하는 Bitmap을 이용하기 때문에 OOM이 현저히 줄어들게 된다. 단점 사용되지 않는 비트맵을 recycle하지 않고, 계속할당되어있기 때문에, 필요없는 메모리 사용량이 존재하기 된다. 재사용할 비트맵을 유지관리하는 코드가 추가 되어야 한다. 지금부터 설..
Scroller는 View같은 것이 아니고 그냥 단순히 계산기이다. ScrollView나 Listview, RecyclerView 등에서 사용자가 손가락튕기기(플링?)을 한다던가 하면, 화면이 움직이는 데, 이 화면의 움직임이 시작시에는 빠르게 움직이다가 끝날 때 쯤은 천천히 멈추는 경우가 많다. 이런 것들을 Elastic Ease라고 하는데, 이 걸 산수로 현재의 보여질 위치를 계산해 내야한다. 수학을 잘하는 사람이야 쉽게 만들 수 있지만, 초보자 특히 수포자들에게 이 작업은 그리 쉽지는 않다. 안드로이드에서는 이 작업을 바로 할 수 있게 Class를 하나 제공해 주고 있다. Scroller라는 Class인데, 워낙 스크롤할 때 많이 써서 이런 이름이 붙은 듯하다. 스크롤 이외에도 사용처는 많으니 이 ..

이전편에서 설명한 Touch만으로는 단순한 작업만이 가능하다. 터치를 추적해서 이동을 한다거나, 클릭정도만 처리가 가능하기 때문에, 페이지를 넘긴다든지, 천천히 스크롤을 한다든지하는 사용자의 편의성을 위해 제공하는 제스처들을 바로 처리할 수 있게 만들어 두었다. 실제, 이 것을 일일이 만든다는 것은 쉬운일이 아니다. 특히 손가락을 튕기는 fling의 경우는 정말 만들기 어렵다. 터치점들을 일일이 추적하여 산수공식에 넣고, 기기마다 일일이 테스트를 거쳐야 하기 때문에, 수많은 시행착오를 거치다 못해 포기하는 경우가 다반사다. 구글은 이 작업을 쉽게 할 수 있게 미리 만들어 두었다. (땡큐 구글~) 이번 글에서는 click, fling, scroll, longpress등을 다루게 될 것이다. 기본적으로 지원..

안드로이드의 Touch를 다루기위해서는 다음의 내용을 이해하여야 별 어려움없이 만들 수가 있다. 그냥 이리저리 만들어 동작할 수있게 만드는 것은 그리 어렵지는 않지만, 앱을 만들다 보면 결국 제대로된 동작과 부드러운 움직임을 위해 아래목록의 내용을 다시 다 작업을 해야하는 경우가 다반사다. 따라서 관련된 내용을 이 곳에 모두 정리한다. 제목 내용 onTouch와 onTouchEvent 터치의 기본사항을 설명한다. GestureDetector 기본 제스쳐를 다룬다.( GestureDetector.SimpleOnGestureListener ) Scroller 이동속도에 따라 화면에 움직이는 위치를 계산한다. Velocity Tracker 손가락의 이동속도를 다룬다. GestureDectector와 Scale..
- Total
- 103,094
- Today
- 0
- Yesterday
- 121
- 공유 컨텍스트
- 경제보복
- TTS
- 재테크
- 에어콘
- 아끼는 법
- 사용료
- Android
- OpenGLes
- texture
- 환율
- 안드로이드
- 승인
- 블로그
- 전기요금
- 환기
- 예금
- 전기료
- 실외기
- 적금
- 전기세
- Ice Cube
- 애드센스
- 수익
- 금리
- 애드핏
- 광고달기
- 재태크
- 티스토리
- 에어컨