1. PC에 안드로이드 포팅한다.

2. PC에서 가상머신으로 안드로이드 실행(블루스택, 제니모션, vm ware, virtual machine등등)

3. 모비즌이나 screencast같은 툴로 안드로이드 화면을 pc로 전송하여 컨트롤

4. 리눅스 사용자라면 안드로이드 플랫폼을 올려 사용

 

각각 장단점과 용도가 다르다.

하려고 시도중이라면 얼추 뭐가 장단점이 될지 2번이나 2번의 용도 차이가 뭔지 등등은 다알고 시도하는거라 생각하니 패스

 

안드로이드 소스로 이미지 만들기 귀찮으면 여기가서 다운로드 ㄱㄱ

http://www.android-x86.org/

http://www.android-x86.org/download

 

블루스택 - www.bluestacks.com/

제니모션 - https://www.genymotion.com/

virtual box - https://www.virtualbox.org/

vm ware - http://www.vmware.com/

모비즌 - http://www.mobizen.com/

 

단순히 가상머신 포팅의 경우 virtual box보단 vm ware가 좀 더 가벼운 느낌이 든다. mem부터 가볍게 먹고 들어감.

더 가벼운걸 원한다면 구글링 해보면 이 외에도 검증되진 않았지만 더 가벼운 툴들이 많으니 검색해서 사용해보셈

Posted by duehd88
,

W/System.err(5490): java.net.ConnectException: failed to connect to /192.168.123.103 (port 5505): connect failed: ETIMEDOUT (Connection timed out)

 

간혹 위의 에러를 이해할 수 없을 때가 있을 것이다. 주소도 잘 맞췄고 포트도 틀리질 않았는데 왜 안되는가? 구체적인 시나리오는 공인 IP한대에 공유기가 물려있고 그 공유기 아래에 또 다른 공유기가 물려있다. 하지만 포트포워딩을 쓰기 귀찮아서 같은 공유기내에서 각각 사설 IP를 물려받아 데스크탑에 서버를 열고 안드로이드 클라이언트를 물렸다. 그런데 왜 ConnectException이 뜰까?

 

아이피와 포트번호가 틀리지 않았다면 보통 이런 문제는 방화벽등으로 막혀있거나 라우터테이블 같은 곳에서 ip를 찾을 수 없는 문제라고 볼 수 있다. 근데 나는 방화벽 설정도 문제가 없을뿐더러 공유기 내부에 두개(서버와 클라이언트)가 물려있어서 ㅄ이 아닌이상 아이피와 포트번호를 헷갈린 문제도 아니었다. 만약 그랬더라면 바로 찾았을터... 정말 방화벽도 내가 실수한 것도 아니라면 한번 간단하게 분석해보자!

 

우선적으로 우리가 통신하는 것에 대한 이해가 필요할듯 하다. 네트워크에서 통신을 할때 상대의 IP주소도 알아야하지만 실제적으론 MAC 주소를 알아야 통신할 수 있다. 하지만 "IP는 알 수 있어도 MAC주소는 어떻게 제공받는가?"라는 문제가 생긴다. 그래서 ARP(Address Resolution Protocol)가 존재한다. 그리고 이를 통해 통신할 상대의 MAC주소를 가져오고 관리하는 것이다. 그리고 이 MAC주소를 ARP table이란놈으로 관리를 하는데 윈도우 도스창 또는 리눅스의 터미널에서 에서 arp명령어로 간단히 알 수 있다. 그러면 처음에 MAC주소를 어떻게 얻어올까? 바로 IP주소를 통해 MAC주소를 알아온다. 나와 통신할 상대ip주소를 ARP packet에 담아 공유기(스위치)로 request메시지를 보내주면 공유기는 MAC주소를 ff.ff.ff.ff.ff.ff로 설정해서 연결된 모든 MAC주소로 ARP request 메시지를 Broadcasting한다. 그러면 상대의 IP가 일치하는 곳에서 response메세지로 상대 MAC주소가 오게 되고 이를 ARP table에 업데이트하고 업데이트된 후부터는 Unicasting되어서 사용하는 것이다.

 

그러니까 ip는 Logical Address로 라우팅을 위한(최단거리를 찾아가기위한) 목적을 가지고 있고 실질적인 통신은 Physical Address인 MAC Address로 상대방을 구분하여 통신을 하는 것이다. 그러므로 내가 ip와 port번호가 맞았다고 한들 MAC주소를 알아내지 못하니 통신이 불가능

한것...

 

이를 해결하기 위해 데스크탑 ARP table이든 안드로이드 ARP table이든 간에 서로의 MAC주소를 등록시켜줘야 하는 것인데 의문인 것은 위에서 설명했던것처럼 내가 이미 소켓 연결을 하려고 할때 이미 ARP table을 업데이트 하고 통신하는 것이 정상이다. 근데 왜 안되는 것일까?

 

------------------------------------------------------------------------------------------------------------------------------

결국 결론은 공유기 문제인것 같다. LG공유기로 바꾼 후 부터 인터넷이 자주 끊기는 문제가 잦았고 문제가 많았다. 아마 LG 공유기라서 이러한 문제가 있는것 같다. 기존의 공유기에서는 이러한 문제도 없었을 뿐더러 다른 집이나 학교의 공유기에선 전혀 문제가 없었다.

또 LG공유기에 사설 IP를 고정으로 할당하는 기능이 없다. 이런 쓰레기같은... 역시 LG는 디스플레이말곤... 노답이다.

Posted by duehd88
,

LayoutInflater로 레이아웃 교체하기

레이아웃 전체를 교체하거나 부분을 교체할때 LayoutInflater로 교체를 할 수 있다.
사용 방법은 주석으로 잘달아 놨으니... 걍 저렇게 쓰면 된다.

1
2
3
4
5
6
7
// activity_main.xml에서 정의한 LinearLayout 할당
LinearLayout inflated = (LinearLayout)findViewById(R.id.changed_layout);
// LayoutInflater 객체 생성
LayoutInflater inflater =  (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Inflated_Layout.xml로 구성한 레이아웃을 inflated영역(R.id.changed_layout)으로 교체
inflater.inflate(R.layout.new_layout, inflated);
 


Posted by duehd88
,

android.os.NetworkOnMainThreadException

정말 안드로이드 시스템의 기초적인 부분을 간과한 문제이다. MainThread에서 소켓통신을 행할 경우 Runtime error를 내품는다.

안드로이드에서 소켓통신은 Thread를 따로 만들어서 통신하자.

Posted by duehd88
,

- 윈도우 -

시스템변수에 JDK환경변수를 등록 : jdk가 설치된 경로를 환경변수를 등록한다. 이름은 맘대로... 대개 JAVA_HOME이라고 한다.

시스템변수에 Path 추가 : %JAVA_HOME%\bin;ADT Bundler가 있는 디렉토리\sdk\platform-tools;

시스템변수에 CLASSPATH 추가 : %JAVA_HOME%\lib\tools.jar;

 

요즘 개발하는 곳이 하도 바뀌어 간단하게 adt번들러로 구축한다. 구축하다가 깜빡하지 말자!

나만 알아볼수있어서...ㅈㅅ

해본사람은 저거만봐도 알수있을것이다...

Posted by duehd88
,

안드로이드 Camera.Parameter setPreviewFormat으로 들어오는 포맷을 바꾸려고 하는데...

setPreviewFormat(ImageFormat.NV21); 이거 밖에 안먹힌다....

 

ImageFormat.JPEG

ImageFormat.NV16

ImageFormat.NV21

ImageFormat.RGB_565

ImageFormat.UNKNOWN

ImageFormat.YUV_420_888

ImageFormat.YUV2

ImageFormat.YV12

 

이 정도인데 모바일 제조사나 api level에 조금씩 다른듯하다. 그래서 png파일 저장하는 코드가 쓸데없이 길어졋다.

그냥 YubImage로 받아서 byteArrayOutputStream에 넣어주고 Bitmap에 넣어 사용하는 방법을 택했다.

 

저장포맷에 따라 압축을 또 달리해주다 보니 찍는 속도가 오락가락한다. 더 고민해봐야 할거 같다.

Posted by duehd88
,

안드로이드에서 화면 회전시 Activity가 destroy되고 다시 create하는데 이때 onCreate 코드들이 다시 실행된다.

즉, destroy와 create를 직접 만지겠다는 설정을 해야한다.

이 설정은 AndroidManifestdml activity element부분에 property를 부여 해주어야 한다.

android:configChange="keyboardHidden|orientation|screenSize"

 

screenSize가 빠진 코드를 많이 보았다. 경우에 따라서 이 부분이 굉장히 중요한데 이를 넣지 않으면 onCreate를 수행하고 넣으면 안하는 차이가 있기 때문에 주의해야한다.

 

저 이벤트의 경우 직접 처리하는 부분이 onConfigurationChanged(Configuration newConfig)이다.

 

@Override
 public void onConfigurationChanged(Configuration newConfig){

// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);

}

Posted by duehd88
,

 Activity는 focus되었을 때 사용자와 상호작용을 할수있다.

즉 사용자가 앱을 실행하여 상호작용하고 싶다면 무조건 하나는 필요하다는 이야기이다.

없다면 앱을 설치해도 볼수가 없다.

 

 이 Activity는 기본적으로 네가지의 State를 가진다.

- foreground 상태에 있을(stack의 맨위에 있는) 경우를 active 또는 running이라 한다.

- activity가 focus(초점)을 잃었지만 화면에서 계속 볼 수 있는 경우 그것은 paused라 한다. 메모리의 상태가 최악의 경우일 때 시스템에 의해     강제종료 당할 수 있다.

- activity가 완전히 다른 activity에 의해 가려진 경우는 stopped 라 한다. 메모리가 다른 곳에서 필요한 경우가 있으면 시스템에 의해 강제 종료     당할수 있다.

- paused나 stopped상태일 때, 이를 시스템이 강제로 메모리에서 제거할 수 있습니다. 이 Activity가 사용자에게 다시 표시될 경우 previous state를 복구해낸다. 

 

그리고 Activity의 상태가 전이될 때 다음의 메서드들이 호출됨으로 인해 State가 알려지게 된다.

- void onCreate(Bundle saveInstanceState) : 모든 Activity는 Object가 처음 instance화 될때 초기 SetUp을 위해서 onCreate를 구현 해야 한다.

- void onStart()

- void onRestart()

- void onResume()

- void onPause()

- void onStop()

- void onDestroy()

그리고 이 메서드들은 사용사가 Override할 수 있다.

State diagram for an Android Activity Lifecycle.

출처 : http://developer.android.com/reference/android/app/Activity.html

 

이러한 Method들을 합쳐서 Activity의 전체 Lifecycle을 정의하게 된다.

그리고 이 Method들을 구현함으로써 모니터 가능한 3개의 NestedLoops가 존재하게 된다.

- Entire Lifetime : onCreate()의 최초 호출부터 onDestroy()까지 남아있는 모든 리소스 해제까지의 시간

- Visible Lifetime : onStart()를 호출하고 onStop()이 호출될 때 까지를 말한다. 이 시간 동안에는 Activity화면을 사용자가 볼 수 있고  필요한 리소스들을 유지할 수 있다.

- Foreground Lifetime : onResume()을 호출하고 onPause()가 호출될 때 까지를 말한다. 이 시간 동안에서 Activity는 사용자가 볼 수 있고  스크린의 맨앞에서 사용자와 상호작용을 하게된다. 이 Method의 코드들을 매우 가벼워야 좋다.

Posted by duehd88
,

AsyncTask

Programing/android 2014. 6. 29. 19:56

제대로 공부도 안하고 doInBackground와 onPostExecute만 이용하거나 thread만 구현해서 사용해왔다. 그런데 AsyncTask를 많이 접하게 되면서 제대로된 사용을 위해 작성해본다.

 

- Thread와 Handler를 모르더라도 이 기법을 사용할 수 있게끔 짜여져 있는 abstract class이다.

- 내부적으로 백그라운드 쓰레드를 생성한다.

- 필요할 때마다 UI에서 실행될 콜백메서드 호출이 가능하다.

 

▶ abstract class 이므로 generic parameter로 3가지 형태를 전달해 준다.

1. Params : 실행할 때 전달할 인수의 형태

2. Progress : 매 작업 단계마다 진행상태를 표기하는 형태

3. Result : 작업 결과로 리턴될 형태

 

▶ callback method

1. void onPreExecute() :

- doInBackground(Params) 호출 전에 먼저불린다.

- doInBackground(Params) 작업전에 초기화 처리, dialog같은 작업을 처리한다.

2. Result doInBackground(Params ...params) :

- 백그라운드 쓰레드에서 실행되기 때문에 연산이 오래걸리는 부분을 여기서 담당한다.

- execute(Params)메서드로 인자를 전달하는데 이 인자는 여러개가 전달이 가능하다.

- 여러개의 전달된 인자는 배열처럼 이용한다.

- 작업중에 publishProgress(Progress)로 이용해서 작업경과를 UI thread에 보고할 수 있다.

- 결과를 onPostExecute(Result result)의 인자로 반환한다.

3. void onPostExecute(Result result) :

- 이는 doInBackground(Params)가 호출된 다음 불린다.

- doInBackground작업의 결과를 이용한 UI 업데이트에 이용하기 좋다.

4. void onProgressUpdate(Progress ...values) :

- doInBackground에서 publishProgress(Progress)를 이용해 호출한다.

- 인자값에 따른 작업의 상태를 UI에 표시한다던가 이런 류의 작업을 할때 이용된다.

5. void onCancelled() :

- cancel메서드로 작업을 취소했을 경우 불리는 메서드이다.

- 자원의 반환같은 처리등을 하면 좋다.

 

▶ AsyncTask class method callback

1. AsyncTask<Params,Progress,Result> execute(Params... params) :

- execute를 호출하면 AsyncTask의 각 메서드가 순차적으로 호출되어 작업을 수행한다.

- 반환되는 AsyncTask객체는 메인 스레드에서 참조가 가능하며 다음 메서드들을 호출한다.

- 인자값을 넘겨주는데 형태만 같다면 여러개를 동시에 넘길 수 있다.(배열형태로 넘기는게 아님)

2. boolean cancel(boolean mayInterruptIfRunning) :

- 작업을 취소한다. onCancelled()메서드 호출한다.

- 작업 취소가 실패되는 경우가 있는데 이미 작업이 완료되었거나 이미 취소된 경우, thread safe하지 않은 경우이다.

- 작업이 시작되기전에 호출할 경우 취소를 성공한것으로 처리된다.

3. boolean isCancelled() :

- isCancelled 메서드는 정상 종료되지 않고 취소되었는지를 반환한다.

4. Result get([long timeout,TimeUnit unit]) :

- 작업이 완료되기까지 대기하며 작업결과를 돌려 받는다.

- 필요시 인자값을 전달해서 대기할 타임아웃값을 지정할 수 있다.

5. AsyncTask.Status getStatus() :

- 작업의 현재 상태를 조사

- 아직 시작하지 않은 상태이면 PENNING이 반환된다.

- 실행중인 경우에는 RUNNING이 반환된다.

- 작업이 완료된 경우에는 FINISHED가 반환된다.

 

주의 할 점은 Backgorund단에서 실행되는 메서드인 doInBackground(), publicProgress()에서는 UI에 접근하는 작업을 하면 안된다.

Posted by duehd88
,

Volley - Network & ImageLoading 라이브러리 ( google I/O 2013 )

 

 

특징

* requestQueue를 이용한 동시요청 처리

* 요청 우선순위 설정 가능 ( A요청이 B요청보다 먼저 응답을 받아야 할 경우 )

* 요청 취소 기능 ( adapter 같은 곳에서 scrolling 이 빠른경우 응답이 않왔을때는 취소가 필요하죠. )

* android 하위 버전(2.3)에서 존재하던 HttpURLConnection의 버그 해결

* NetworkImageView 제공

 

간단한사용법은 원본글 링크로 고고

원본글 링크 - http://hanburn.tistory.com/135

valley - https://android.googlesource.com/platform/frameworks/volley

샘플 - https://github.com/ogrebgr/android_volley_examples

'Programing > android' 카테고리의 다른 글

Activity Lifecycle  (0) 2014.07.06
AsyncTask  (0) 2014.06.29
이미지 Out Of Memory 문제 간단하게 해결하기  (0) 2014.06.28
Background Thread에서 UI 접근하기  (0) 2014.06.27
Bluetooth 개발 01. 기초  (0) 2014.06.25
Posted by duehd88
,