'android'에 해당되는 글 13건
- 2015.11.14 android 4.4 kitkat debugging 디버거 접속 안되는 문제 해결하기
- 2015.08.28 android studio jar로 된 라이브러리 추가 하기
- 2014.07.17 android thread handler 설명
- 2014.07.16 안드로이드 쓰레드 정리 3
- 2010.12.24 믹사리 증강현실엔진에 데이타 넣기
- 2010.12.14 DefaultHttpClient로 SSL싸이트 접근하기
- 2010.12.04 java 의 스트링 인코딩이해( 자바 한글 깨짐해법을 위한연구)
- 2010.08.13 안드로이드 NDK R4 일리히트 연동하기 6
- 2010.03.27 오드로이드 구매했습니다.
- 2010.03.27 android os 에 일리히트엔진 올려보기 강좌.(irrlicht 엔진 1.7.1 base)
이경우에는 MTP모드로 연결이 되어있는데 이것을 PTP모드로 바꾸어 접속하시면 디버깅연결이됩니다.
설정에 들어가시면 저장소 옵션에 설정하는것이 있습니다.
'android' 카테고리의 다른 글
android studio jar로 된 라이브러리 추가 하기 (0) | 2015.08.28 |
---|---|
android thread handler 설명 (0) | 2014.07.17 |
안드로이드 쓰레드 정리 (3) | 2014.07.16 |
믹사리 증강현실엔진에 데이타 넣기 (0) | 2010.12.24 |
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
파일->new -> new module
import JAR/AAR Package 선택
파일선택
여기까지하면 좌측 트리뷰에 원하는 모듈이 등록된걸볼수있다.
project structure-> 좌측 모듈탭에서 app 선택 -> dependency 탭 -> +버튼 -> 3 Module dependency 선택
방금 추가한 모듈을 리스트에 뜨면 선택한다.
ok 하면 디펜던시리스트에 추가된것을 볼수있다.
'android' 카테고리의 다른 글
android 4.4 kitkat debugging 디버거 접속 안되는 문제 해결하기 (0) | 2015.11.14 |
---|---|
android thread handler 설명 (0) | 2014.07.17 |
안드로이드 쓰레드 정리 (3) | 2014.07.16 |
믹사리 증강현실엔진에 데이타 넣기 (0) | 2010.12.24 |
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
핸들러가 필요한이유는 다음과 같습니다.
안드로이드쓰레드는 특징이 하나 있습니다. 앞에서 쓰레드는 독립적인 스택공간을 가지지만 독립적인 전역 메모리 공간은 가지지못한다고했습니다.
그러면 지역변수들은 서로 분리가 되지만 쓰레드를 호출했던쪽의 쓰레드와 현재쓰레드는 같은 프로세스의 전역 메모리공간을 공유하게 됩니다. 그런데 서로 다른 쓰레드가 같은 전역 메모리를 접근할경우 임계영역 관련 이슈들이 나오게 됩니다. 그래서 안드로이드는 사전에 임계영역 관련 이슈를 원천차단하고자 쓰레드가 다르면 전역 메모리공간을 공유하지못하도록 했습니다. 다시 말해서 쓰레드객체의 멤버변수들은 다른 쓰레드에서 접근할수가없습니다.
다른쓰레드의 멤버에 접근해야할필요가 있으면 Handler를 통해서만 접근가능하도록 했습니다.
안드로이드에서 화면상에 버튼이나 텍스트박스등의 객체들의 인스턴스는 모두 ui 쓰레드에 있습니다.
따라서 위에서 설명한봐와같이 다른 thread 객체의 run함수 내에서는 ui쓰레드에 있는 객체들을 접근할수는 없습니다.
그래서 핸들러를 이용해서 우회적인 방법을 사용합니다.
public class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Log.d(TAG,"handler call");
mTextvw.append((String) msg.obj);
mTextvw.append("\n");
}
}
핸들러는 위와 같이 정의 합니다.
Handler 에서 상속받고 handleMessage를 오버라이딩합니다. 그리고 핸들러 내부함수(handleMessage )에서는 ui쓰레드쪽 객체들을 사용할수 있습니다.
sendMessage 함수가 호출되면 handleMessage가 콜백 됩니다.
그리고 이것을 쓰레드나 러너블에서 상속 받은 클래스의 run 함수에서 sendMessage 함수를 호출해주면됩니다.
public void run() { try { Log.d(TAG,"1"); while (!Thread.currentThread().isInterrupted()) { sleep(1000); mHandler.sendMessage(mHandler.obtainMessage(1,0,0,"tick: " + System.currentTimeMillis())); Log.d(TAG,"tick: " + System.currentTimeMillis()); } } catch (InterruptedException e) { e.printStackTrace(); Log.e(TAG,"InterruptedException"); } }
obtainMessage 함수로 메씨지 객체를 만들어서 넘겨줍니다.
이렇게 만들어진 객체는 handleMessage에서 Message 객체로 넘어오는 인자에 담겨지게됩니다.
obtainMessage 에 순서대로 what,arg1,arg2,obj 순서로 인자를 넘겨줍니다.
받는쪽에서도 마찬가지로 what,arg1,arg2,obj 이름의 멤버변수로 넘겨운 인자들을 받아볼수있습니다.
package com.gbox3d.threadsample2; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; public class MyActivity extends Activity { public TextView mTextvw; public Handler mHandler; public Thread mThread; private final String TAG = "Thread_sample2"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mTextvw = (TextView) findViewById(R.id.textvw); mHandler = new MyHandler(); findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if(mThread != null) { mThread.interrupt(); mThread = null; } else { mThread = new Thread() { @Override public void run() { super.run(); Log.d(TAG,"start"); try { Log.d(TAG,"1"); while (!Thread.currentThread().isInterrupted()) { sleep(1000); mHandler.sendMessage(mHandler.obtainMessage(1,0,0,"tick: " + System.currentTimeMillis())); Log.d(TAG,"tick: " + System.currentTimeMillis()); } } catch (InterruptedException e) { e.printStackTrace(); Log.e(TAG,"InterruptedException"); } } }; mThread.start(); } } } ); //findViewById() } @Override protected void onDestroy() { super.onDestroy(); mThread.interrupt(); Log.d(TAG,"ondestroy"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.my, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public class MyHandler extends Handler { @Override public void handleMessage(Message msg) { Log.d(TAG,"handler call"); mTextvw.append((String) msg.obj); mTextvw.append("\n"); } } }
'android' 카테고리의 다른 글
android 4.4 kitkat debugging 디버거 접속 안되는 문제 해결하기 (0) | 2015.11.14 |
---|---|
android studio jar로 된 라이브러리 추가 하기 (0) | 2015.08.28 |
안드로이드 쓰레드 정리 (3) | 2014.07.16 |
믹사리 증강현실엔진에 데이타 넣기 (0) | 2010.12.24 |
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
안드로이드에서 쓰레드란 어떤 의미일까요?
안드로이드앱은 기본적으로 쓰레드입니다. 우리가 흔히들 액티비티라고 하는것들 그것은 ui를 다루는 쓰레드입니다.
그래서 ui스레드라고도 합니다. 또는 앱의 기본이 되는 쓰레드 이므로 메인쓰레드라고도 합니다.
쓰레드는 실행단위입니다. 그러면서 독립적인 스택공간이 있습니다. 프로세스처럼 독립된 전역메모리 공간은 가지지못합니다.
쉽게 말해서 그냥 함수입니다.
그러나 일반적인 함수는 종속관계가 존재 합니다. 최종적으로 누군가의 부름을 받고 호출되어 실행되는게 우리가 일반적으로 아는 함수입니다.
쓰레드도 비슷합니다. 다른점은 일반적인 펑션콜은 호출 됐다가 실행점이 되돌아오길 기다립니다.
여기에 반해서 쓰레드는 호출되고 기다리지않습니다. 호출한쪽은 자기 볼일을 그대로 계속 보게됩니다.
그래서 동시에 여러개의 앱이 실행되는것도 쓰레드이기 때문에 가능 한것입니다.
또한 당연한 이야기 이겠지만 ui가 붙지않는 쓰레드도 존재합니다. 그것을 서비스라 부릅니다.
쓰레드 를 만드는 방법은 크게 두가지방법이 있고 또하나는 첫번째 방법을 간편하게 만드는 방법까지 총 3가지 방법 있습니다.
첫번째는 run함수를 오버라이딩해서 쓰레드상에서 동작하는 코드들을 그안에 넣는 방법이 있습니다.
두번째는 Runnable 인터페이스에서 상속받아서 그것을 Thread 객체의 생성자에 넣어 주는 방법입니다.
run 함수를 오바라이딩 받아서 하는 방식 입니다. 1000초 간격으로 틱값을 콘솔창에 출력하는 예제입니다.
class MyThread2 extends Thread { @Override public void run() { super.run(); while(!Thread.currentThread().isInterrupted()) { try { Log.d(TAG, "thread 2 tick :" + System.currentTimeMillis()); sleep(1000); } catch (InterruptedException e) { Log.e(TAG, "InterruptedException in thread. " + e.getMessage()); e.printStackTrace(); Thread.currentThread().interrupt(); //Log.d(TAG, "" + Thread.currentThread().isInterrupted()); } } } }
위의 예제는 다음과 같이 사용되어 집니다.
MyThread2 mThread_test2 = new MyThread2();
mThread_test2.start();
다음은 러너블을 상속받아 구현한 예제일부분 입니다. 단순히 클래스를 new 해서 인스턴스를 얻은 다음 start해주면 됩니다.
class MyRunnable implements Runnable { @Override public void run() { while(!Thread.currentThread().isInterrupted()) { try { Log.d(TAG, "thread 3 tick :" + System.currentTimeMillis()); Thread.sleep(1000); } catch (InterruptedException e) { Log.e(TAG, "InterruptedException in thread. " + e.getMessage()); e.printStackTrace(); Thread.currentThread().interrupt(); //Log.d(TAG, "" + Thread.currentThread().isInterrupted()); } } } }
러너블을 이용한 방법은 다음과 같이 사용 되어 집니다.
mThread_test3 = new Thread(new MyRunnable()); mThread_test3.start();
러너블 클래스의 인스턴스를 생서자로 넘겨 줍니다.
간편쓰레드 만드는 방법도 있습니다.
mThread_test1 = new Thread() { public void run() {
//..쓰레드 구현 코드 } }; mThread_test1.start();
package com.gbox3d.threadsample; import android.app.Activity; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MyActivity extends Activity { public final String TAG="thread_test"; public Thread mThread_test1 = null; public Thread mThread_test2 = null; public Thread mThread_test3 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); //첫번째 간편 쓰레드 생성하기 findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if(mThread_test1 == null) { //간편 만들기 mThread_test1 = new Thread() { public void run() { while(!Thread.currentThread().isInterrupted()) { try { sleep(1000); Log.d(TAG, "tick :" + System.currentTimeMillis()); } catch (InterruptedException e) { Log.e(TAG, "InterruptedException in thread. " + e.getMessage()); e.printStackTrace(); Thread.currentThread().interrupt(); //Log.d(TAG, "" + Thread.currentThread().isInterrupted()); } } } }; mThread_test1.start(); } else { mThread_test1.interrupt(); mThread_test1 = null; } } } ); //두번째 예제 findViewById(R.id.button2).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if(mThread_test2 == null) { mThread_test2 = new MyThread2(); mThread_test2.start(); } else { mThread_test2.interrupt(); mThread_test2 = null; } } } ); //3번째 러너블을 이용한 방법 findViewById(R.id.button3).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if(mThread_test3 == null) { mThread_test3 = new Thread(new MyRunnable()); mThread_test3.start(); } else { mThread_test3.interrupt(); mThread_test3 = null; } } } ); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.my, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } class MyThread2 extends Thread { @Override public void run() { super.run(); while(!Thread.currentThread().isInterrupted()) { try { Log.d(TAG, "thread 2 tick :" + System.currentTimeMillis()); sleep(1000); } catch (InterruptedException e) { Log.e(TAG, "InterruptedException in thread. " + e.getMessage()); e.printStackTrace(); Thread.currentThread().interrupt(); //Log.d(TAG, "" + Thread.currentThread().isInterrupted()); } } } } class MyRunnable implements Runnable { @Override public void run() { while(!Thread.currentThread().isInterrupted()) { try { Log.d(TAG, "thread 3 tick :" + System.currentTimeMillis()); Thread.sleep(1000); } catch (InterruptedException e) { Log.e(TAG, "InterruptedException in thread. " + e.getMessage()); e.printStackTrace(); Thread.currentThread().interrupt(); //Log.d(TAG, "" + Thread.currentThread().isInterrupted()); } } } } }
'android' 카테고리의 다른 글
android studio jar로 된 라이브러리 추가 하기 (0) | 2015.08.28 |
---|---|
android thread handler 설명 (0) | 2014.07.17 |
믹사리 증강현실엔진에 데이타 넣기 (0) | 2010.12.24 |
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
java 의 스트링 인코딩이해( 자바 한글 깨짐해법을 위한연구) (0) | 2010.12.04 |
출처: http://code.google.com/p/mixare/wiki/DisplayYourOwnData
믹사리 엔진에서 처리할수있는 트윗 jSON 스트림 포멧 예제입니다.
{
"status": "OK",
"num_results": 3,
"results": [
{
"id": "2827",
"lat": "46.43893",
"lng": "11.21706",
"elevation": "1737",
"title": "Penegal",
"distance": "9.756",
"has_detail_page": "1",
"webpage": "http%3A%2F%2Fwww.suedtirolerland.it%2Fapi%2Fmap%2FgetMarkerTplM%2F%3Fmarker_id%3D2827%26project_id%3D15%26lang_id%3D9"
},
{
"id": "2821",
"lat": "46.49396",
"lng": "11.2088",
"elevation": "1865",
"title": "Gantkofel",
"distance": "9.771",
"has_detail_page": "0",
"webpage": ""
},
{
"id": "2829",
"lat": "46.3591",
"lng": "11.1921",
"elevation": "2116",
"title": "Roen",
"distance": "17.545",
"has_detail_page": "1",
"webpage": "http%3A%2F%2Fwww.suedtirolerland.it%2Fapi%2Fmap%2FgetMarkerTplM%2F%3Fmarker_id%3D2829%26project_id%3D15%26lang_id%3D9"
}
]
}
'android' 카테고리의 다른 글
android thread handler 설명 (0) | 2014.07.17 |
---|---|
안드로이드 쓰레드 정리 (3) | 2014.07.16 |
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
java 의 스트링 인코딩이해( 자바 한글 깨짐해법을 위한연구) (0) | 2010.12.04 |
안드로이드 NDK R4 일리히트 연동하기 (6) | 2010.08.13 |
- Grab all required certificates (root and any intermediate CA’s)
- Create a keystore with keytool and the BouncyCastle provider and import the certs
- Load the keystore in your android app and use it for the secured connections
- Don’t use the standard java.net.ssl.HttpsURLConnection for the secure connection. Use the Apache HttpClient (Version 4 atm) library, which is already built-in in android. It’s built on top of the java connection libraries and is, in my opinion, faster, better modularized and easier to understand.
'android' 카테고리의 다른 글
안드로이드 쓰레드 정리 (3) | 2014.07.16 |
---|---|
믹사리 증강현실엔진에 데이타 넣기 (0) | 2010.12.24 |
java 의 스트링 인코딩이해( 자바 한글 깨짐해법을 위한연구) (0) | 2010.12.04 |
안드로이드 NDK R4 일리히트 연동하기 (6) | 2010.08.13 |
오드로이드 구매했습니다. (0) | 2010.03.27 |
in
.'android' 카테고리의 다른 글
믹사리 증강현실엔진에 데이타 넣기 (0) | 2010.12.24 |
---|---|
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
안드로이드 NDK R4 일리히트 연동하기 (6) | 2010.08.13 |
오드로이드 구매했습니다. (0) | 2010.03.27 |
android os 에 일리히트엔진 올려보기 강좌.(irrlicht 엔진 1.7.1 base) (0) | 2010.03.27 |
'android' 카테고리의 다른 글
DefaultHttpClient로 SSL싸이트 접근하기 (0) | 2010.12.14 |
---|---|
java 의 스트링 인코딩이해( 자바 한글 깨짐해법을 위한연구) (0) | 2010.12.04 |
오드로이드 구매했습니다. (0) | 2010.03.27 |
android os 에 일리히트엔진 올려보기 강좌.(irrlicht 엔진 1.7.1 base) (0) | 2010.03.27 |
iPhone에 irrlicht engine 올리기 (9) | 2010.02.28 |
'android' 카테고리의 다른 글
java 의 스트링 인코딩이해( 자바 한글 깨짐해법을 위한연구) (0) | 2010.12.04 |
---|---|
안드로이드 NDK R4 일리히트 연동하기 (6) | 2010.08.13 |
android os 에 일리히트엔진 올려보기 강좌.(irrlicht 엔진 1.7.1 base) (0) | 2010.03.27 |
iPhone에 irrlicht engine 올리기 (9) | 2010.02.28 |
D3DM irrlicht 엔진용 드라이버 제작기 강좌 계획 (0) | 2009.12.20 |
전체화면은 더블클릭입니다.
'android' 카테고리의 다른 글
안드로이드 NDK R4 일리히트 연동하기 (6) | 2010.08.13 |
---|---|
오드로이드 구매했습니다. (0) | 2010.03.27 |
iPhone에 irrlicht engine 올리기 (9) | 2010.02.28 |
D3DM irrlicht 엔진용 드라이버 제작기 강좌 계획 (0) | 2009.12.20 |
activesync 4.5 입니다. (0) | 2009.12.01 |