글

(안드로이드) Handler

이미지
*기본 생성자를 통해 Handler를 생성하면, 생성되는 Handler는 해당 Handler를 호출한 스레드의 MessageQueue와 Looper에 자동연결된다. 이런식으로 메인스레드에서 Handler를 생성하게 되면 Handler는 호출한 스레드의 메시지큐와 자동연결되므로 다른 스레드에서 Handler를 통해 메시지를 전달하면 메인스레드(UI스레드)에서  작업을 가능하게 하는 것입니다. 안드로이드에선 메인스레드와 서브스레드간의 Handler를 통해 메시지를 전달하여 메시지 큐에 저장하는 방식의 통신을 사용합니다. 메시지큐는 FIFO(First In First Out)방식으로 먼저 전달받은 메시지를 먼저 처리합니다. Handler의 메시지처리 함수는 아래와 같다. *Handler.sendEmptyMessage(int what) ->Message what(ID)를 사용할 경우 사용하는 메소드 *Handler.sendMessage(Message msg) ->Message what,arg1,obj등 ID와 정보등을 같이 사용하는 경우

(안드로이드) Handler

이미지
*기본 생성자를 통해 Handler를 생성하면, 생성되는 Handler는 해당 Handler를 호출한 스레드의 MessageQueue와 Looper에 자동연결된다. 이런식으로 메인스레드에서 Handler를 생성하게 되면 Handler는 호출한 스레드의 메시지큐와 자동연결되므로 다른 스레드에서 Handler를 통해 메시지를 전달하면 메인스레드(UI스레드)에서  작업을 가능하게 하는 것입니다.

(안드로이드) BaseAdapter

<BaseAdapter 클래스를 상속받는 어댑터 클래스가 필요한 상황> 어댑터 뷰와 관계되는 어댑터를 구현해야 하는 경우, BaseAdapter 클래스를 상속받는 어댑터 클래스를 구현하면 된다. ArrayAdapter클래스 역시 BaseAdapter가 부모클래스이다. 전자보다 후자가 어댑터를 구현하기에 보다 자유롭다. <오버라이드 해야 할 BaseAdapter클래스의 메소드들> ArrayAdapter를 상속받는 어댑터 클래스를 구현할 때는 전자의 getView메소드를 오버라이드(Override)해야 한다. BaseAdapter를 상속받는 경우는 그 외에 추가로 오버라이드 해야 할 메소드들이 있다. public int getCount() public Object getItem(int position) public long getItemId(int position) public View getView(int position, View convertView, ViewGroup parent) <public int getCount()> ->자식 뷰들의 개수를 리턴하는 메소드이다. 여기서 자식 뷰는 어댑터 뷰의 자식 뷰임을 의미한다. <public Object getItem(int position)> ->어댑터 뷰의 자식 뷰가 n개라면, 어댑터 객체가 갖는 항목의 개수 역시 n개이다. getItem메소드는 항목들 중 하나를 리턴하는 메소드이다. 여기서 항목은 자식 뷰의 내용을 갖고 있는 객체이다. int position            리턴할 항목의 위치를 의미한다.            예를들어, position의 값이 2이면, 이 메소드는 2번쨰 항목을 리턴한다. <public long getItemId(int...

(안드로이드) LayoutInflater

*inflate는 사전적의미로 "부풀리다"라는 뜻이다. 안드로이드에서 inflate를 사용하면 xml에 씌여져있는 view의 정의를 실제 view 객체로 만드는 역할을 한다. 마치 설계도를 실제 건물로 만드는 것과 같다. [사용법] 먼저 inflate를 사용하기 위해서는 우선 inflater를 얻어와야 한다. LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 다음은 설계도 역할인 xml이 필요하다. 이때 xml의 root view의 type이 무엇인지 알아야 한다. 예를들어, xml파일이름이 aa.xml이고, root가 LinearLayout이라면 LinearLayout linearLayout=(LinearLayout)inflater.inflate(R.layout.aa,null); 가져온 view를 화면에 그린다면 setContentView(linearLayout); [인플레이터를 얻어오는 다른 방법] LayoutInflater inflater=LayoutInflater.from(this); Layoutinflater inflater=getLayoutInflater();(@activity) [추가 정보] inflater는 성능상의 문제 때문에 compile time에 완성된 xml파일에 대해서만 적용된다. 즉, Runtime에 작성되거나 제공되는 xml에 대해서는 inflate를 적용할 수 없다. 다시말해, R. 으로 시작되는 resource파일들만 inflate가 가능하다.

(Java멀티쓰레드 디자인패턴) 순차,병렬,병행의 개념

*순차(Sequential): 복수의 업무를 [순서대로 처리]해 나가는 모습. 예를들어, 한 명이 100개의 업무를 처리할 떄 그 사람이 업무를 순차적으로 처리해 나가는 것과 마찬가지이다. *병렬(Parallel): 복수의 업무를 [동시에 처리]하는 모습. 예를들어, 10개의 업무를 2명이 분담하여 처리할 때 두 사람이 업무를 병렬적으로 처리해 나가는 것과 같은 이치. *병행(concurrent): 순차, 병렬보다 추상도가 높은 표현이다. 이것은 한 개의 업무를 [어떠한 순서로 처리하든 상관없는 여러 개의 작업]으로 분할하는 모습. 10개의 업무를 2종류의 독립된 작업으로 분할해 두면 병행 처리할 수 있는 준비가 끝난다. 작업자가 한명이라면 병행 처리 할 수 있도록 분할해 둔 작업을 순차적으로 처리하게 되지만, 작업자가 2명이라면 같은 작업을 병렬적으로 처리할 수도 있다. 멀티쓰레드 프로그램은 병행처리를 기술한 것이다. 만일 CPU가 한개라면 병행처리를 순차적으로 실행할 테고, CPU가 여러 개라면 병행처리를 병렬적으로 실행할지도 모른다. 우리가 사용하고 있는 컴퓨터는 대개 CPU가 한 개이므로 복수의 쓰레드가 작동하고 있다 하더라도 병행처리를 순차적으로 실행하게 된다.

(안드로이드) Parcelable

*Serializable 과 Parcelable의 차이점 참고: http://aroundck.tistory.com/2477 이 Parcelable의 뜻은 소포 또는 꾸러미란 뜻이다. 이 Parcelable는 Interface로, 이 녀석을 구현한 Class는 Parcel로 쓰여질 수도 있고, Object로 복구될 수도있다. Process간 정보 교환시 포장 압축하여 전달하고, 받으면 포장을 해제하는 것을, Interface로 만든것이라 보면 된다. 이 Parceleabe을 구현한 Class는 CREATOR라는 static field를 "반드시" 가지고 있어야 한다. 이 CREATOR라는 녀석은 Parcelable.Creator interface를 구현한 놈으로, 해당 Parcel이 어떻게 restore되는지 기술하고 있다. 이 Parcelable은 IPC,즉 프로세스간 통신에도 아주 유용하게 쓰인다. 이 녀석을 구현한 class는 IPC시 추가 작업 없이 process사이를 넘어 다닐 수 있따 물론 Serializable보다 빠르다. [Parcel이라는 녀석은 무엇인가?] IPC시 이 꾸러미를 다른 프로세스로 휙 던져주는 방식이다. Parcelable class가 IPC를 위해서 포장, 압축이 된 형태라고 볼 수 있다. Developer를 참조하여 부가 설명을 하자면.... Parcel은 IBinder를 통해 전달 될 수 있는 Data나 Object Reference의 Container입니다. 이 Parcel은 primitive type, primitive array type 또는 Parcelable class들을 가지고 있을 수 있습니다. 이 Parcel은 Serialization과 "맥락"은 비슷하지만 "매커니즘"은 다르다. 이 Parcelable은 IPC에서 high performance를 낼 수 있는 형태로 되어 있다. [만드는 방법] 1. 먼...

(안드로이드) 객체직렬화

이미지
*컴포넌트와 컴포넌트간에 데이터 전달을 위해서는 객체직렬화가 필요하다. 객체 직렬화는 Serializable객체를 통해 구현가능하고 추가적으로 Bundle,Parcel, Parcelable객체도 직렬화를 지원한다. 1. Serializable객체 직렬화의 기본 개념은 간단하다. 객체는 메모리에 존재하는 것이다.(new를 통해 객체 생성된 것) 이렇게 메모리에 존재하는 것을 파일 혹은 네트워크를 통해 저장 및 전송할 수 있을까? 객체 자체는 함수와 변수들이 존재한다. 함수와 변수는 메모리의 다른영역에 저장된다.(함수=code영역, 변수=heap영역) 이것을 그대로 파일/네트워크 등으로 전송/저장한다는 것은 쉽지않다. 직렬화는 함수는 신경쓰지 않고 단지 변수를 직렬화시킨다.(byte코드로 순차적으로 나열시킨다.) 왜 그럴까? 함수를 포함한 Class는 데이터가 아니다. 단지 코드일 뿐이다. 그러므로 Class파일만 있으면 참조가 가능하다. (송신측에 xxx.java, 수신측에 xxx.java 코드만 동일하게 존재하면 해결된다.) 그러나 변수는 다르다. 변수는 데이터이므로 코드로 가질 수 없다. 그러므로 직렬화는 이 변수 데이터들을 어떻게 전달하느냐에 관점을 둔다. 아래를 보자. Class 내 함수는 신경쓰지 않고 단지 변수만 직렬화 시킨다. 직렬화 개념은 변수 데이터를 순차적으로 byte코드로 나열하는 것이다. 이렇게 byte코드로 나열되면 이 데이터는 무엇이든 전송이 가능한 것이다. 아래 1번과 같이 객체를 직렬화 하고 2번과 같이 byte코드를 File이든 네트워크든 메모리든 쓸 수 있다. 만일 다시 객체화 시킬때는 4번과 같이 byte코드를 읽고 역직렬화 과정을 거치면 원래 객체를 복원할 수 있는 것이다. 역직렬화 과정에서는 Class코드를 참조하게 된다. 직렬화 방법은 "Serializable"을 상속받으면 자동으로 직렬화 처리되어 객체가 생성된다. 하지만 주의할 ...