java.util.concurrent 패키지
- 일반 자바 Thread 클래스보다 높은 수준의 동시성 프로그래밍을 지원한다...고 함.
- ExecutorService 클래스는 하나 이상의 스레드를 관리하며, 작업(Runnable이나 Callable 인스턴스)이 실행되도록 실행기(ExecutorService 인스턴스)에 넘겨주면 된다.
  그러면 Future 클래스의 인스턴스를 반환되는데, 이 Future클래스는 실행시킨 작업이 반환할, 아직 알 수 없는 값을 참조한다.
 (1) transThread = Executors.newSingleThreadExecutor(); // 실행기 얻기
 (2) transPending = transThread.submit(translateTask); // ExecutorService에 작업(translateTask 쓰레드)를 넘기고 결과를 Future(transPending)로 받음.

외부 스레드에서 Android GUI 스레드의 유저 인터페이스 업데이트 하기
   /**
     * 화면의 텍스트 수정하기(다른 스레드에서 호출됨)
     * @param text
     */
    public void setTranslated(String text) {

        guiSetText(transText, text);
    }

    /**
     * 화면의 텍스트 수정하기(다른 스레드에서 호출됨)
     * @param text
     */
    public void setRetranslated(String text) {

        guiSetText(retransText, text);
    }

   /**
     * GUI 관련한 변경은 모두 GUI스레드에서 이루어져야 한다.<br>
     * 외부 스레드(유저 인터페이스가 아닌)에서 유저 인터페이스 관련 함수를 호출할 수 없음. 외부 스레드에서 GUI스레드에게 유저 인터페이스를 업데이트하라고 요청.
     * @param view
     * @param text
     */
    private void guiSetText(final TextView view, final String text) {

        guiThread.post(new Runnable() {

            @Override
            public void run() {

                view.setText(text);
            }
        });
    }
setTranslated(), setRetranslated() 메소드가 외부 스레드에서 불림 -> guiSetText() 메소드가 실행됨. -> 유저 인터페이스 업데이트

'프로그래밍 > Android' 카테고리의 다른 글

[TDD] 안드로이드 TDD 개발하기  (0) 2010.11.15
[Hello,Android] Android <-> WebView 간 호출하기  (1) 2010.08.31
[Hello,World] Sudoku  (0) 2010.08.31
[Hello,Android] Audio, Video  (0) 2010.08.30
[tip] LogCat 문자깨짐  (0) 2010.08.18
Android쪽
public class LocalBrowser extends Activity {

    private static final String TAG = "LocalBrowser";
    private final Handler handler = new Handler();
    private WebView webView;
    private TextView textView;
    private Button button;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 화면에서 안드로이드 컨트롤 찾기
        webView = (WebView) findViewById(R.id.web_view);
        textView = (TextView) findViewById(R.id.text_view);
        button = (Button) findViewById(R.id.button);

        // 임베딩된 브라우저-WebView-에 자바스크립트 활성화하기
        webView.getSettings().setJavaScriptEnabled(true);

        // 자바 객체-AndroidBridge-를 브라우저의 자바 스크립트에 노출시키기
        // 객체, 노출할 DOM명칭
        webView.addJavascriptInterface(new AndroidBridge(), "android");

        // 임의의 WebChromeClient 객체를 생성하여 WebView에 등록.
        // 여기의 Chrome은 브라우저 창 주의를 정리하는 모든 작업을 일컬음. 즉, 브라우저 처리을 할 클라이언트를 등록
        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
//                return super.onJsAlert(view, url, message, result);
                Log.d(TAG, "onJsAlert(" + view + ", " + url + ", " + message + ", " + result + ")");

                Toast.makeText(LocalBrowser.this, message, 3000).show();

                result.confirm(); // 결과 처리됨
                return true; // 여기서 처리했으므로 true 반환
            }
        });

        // 로컬 assets에서 웹 페이지 로딩하기
        webView.loadUrl("file:///android_asset/index.html");

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick(" + v + ")");

                // 자바스크립트 호출
                webView.loadUrl("javascript:callJS('Hello from Android')");
            }
        });
    }


    /**
     * 자바 스크립트에 노출된 객체
     *
     */
    private class AndroidBridge {
        public void callAndroid(final String arg) { // 반드시 final이어야 함

            handler.post(new Runnable() {

                @Override
                public void run() {
                    Log.d(TAG, "callAndroid(" + arg + ")");

                    textView.setText(arg);
                }
            });
        }
    }
}

WebView쪽
<html>
<head>
<script type="text/javascript">
    function callJS(arg) {
        document.getElementById("replaceme").innerHTML = arg;
    }
</script>
</head>
<body>
<h1>WebView</h1>
<p>
    <a href="#" onclick="window.alert('Alert from JavaScript');">Display JavaScript alert</a>
</p>
<p>
    <a href="#" onclick="window.andriod.callAndroid('Hello from Browser');"></a>
</p>
<p id="replaceme"></p>
</body>
</html>

addJavascriptInterface() 에서 설정한 DOM명칭 "android"로 WebView에서 호출가능하다.

- final 매개변수를 잘 사용하자. -> 메소드 내에서 변경하면 안되는 값(주소값)일 경우에 사용하면 유용할 듯

[Hello,World] Sudoku

프로그래밍/Android 2010. 8. 31. 00:01 Posted by galad
스도쿠 예제

Menu Activity

         I : 메뉴선택

Game Activity -> PuzzleView : 그래픽 처리
(게임 로직 처리)

[Hello,Android] Audio, Video

프로그래밍/Android 2010. 8. 30. 23:58 Posted by galad
Audio, Video 예제

Audio
- MediaPlayer 클래스를 사용.
- create한 개체를 release 안하면 런타임 에러 발생
- 실제론 하나의 소리에 대한 객체를 미리 모두 생성해놓고, 플레이하고, 어플 종료 시 릴리즈하는 식으로 사용하게 될 듯

        // 이전 MediaPlayer의 모든 리소스를 릴리스한다.
        // 아래의 릴리즈를 주석처리하면 사운드가 겹쳐서 들리게도 할 수 있으나, 릴리즈 안하고 계속 생성만 하다보면 런타임 오류 발생
        if(mp != null)
            mp.release();

        // 이 사운드를 재생하기 위해 새로운 MediaPlayer를 만든다.
        mp = MediaPlayer.create(this, resId);
        mp.start();

Video
- VideoView에 video파일 로드 후, start.
- 재생가능한 파일에 제약이 좀 있는 듯.

'프로그래밍 > Android' 카테고리의 다른 글

[Hello,Android] Android <-> WebView 간 호출하기  (1) 2010.08.31
[Hello,World] Sudoku  (0) 2010.08.31
[tip] LogCat 문자깨짐  (0) 2010.08.18
[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17

[tip] LogCat 문자깨짐

프로그래밍/Android 2010. 8. 18. 18:14 Posted by galad
윈도우즈-이클립스에서 LogCat에 UTF-8로 로그를 찍으면 글자가 깨짐.
(우분투 등 OS자체가 UTF-8이면 문제가 없는 듯?)

해결방법은 없는 듯하고 임시방편으로 다음과 같이 처리

1. 이클립스 메뉴의 Run -> Externel Tools -> Externel Tools Configurations... 클릭
2. Program 선택하고 New Launch Configuration 클릭
3. Name에 LogCat(아무거나), Main탭의 Location에 안드로이드 툴의 adb.exe 선택, Arguments에 logcat 입력, Common탭의 Console Encoding에서 UTF-8 선택하고 적용
4. Run하면 이클립스 콘솔창에 LogCat이 실행됨. 보기에는 별로지만 한글 지원됨.

http://code.google.com/p/android/issues/detail?id=1590


'프로그래밍 > Android' 카테고리의 다른 글

[Hello,World] Sudoku  (0) 2010.08.31
[Hello,Android] Audio, Video  (0) 2010.08.30
[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16

[Hello,Android] dip, sp

프로그래밍/Android 2010. 8. 17. 17:01 Posted by galad
px : 화면 위의 점. 디스플레이의 dpi(dots per inch)가 높아지면 그림이 작아짐.
dp : density-independent pixels. 밀도에 독립적인 화소. dpi가 높아지면 같이 커진다.
dip : 구글 예제에서 자주 쓰이는 dp와 동의어
sp : scale-independent pixels. 스케일에 독립적인 화소. 사용자의 글꼴 크기 설정에 따라서 확대/축소된다.

==> 인터페이스가 현재와 미래의 모든 디스플레이에 사용될 수 있으려면
텍스트 크기로는 sp 단위를, 그 외의 경우에는 dip 단위를 사용하고, 비트맵 보다는 벡터 그래픽을 사용하도록 한다.

'프로그래밍 > Android' 카테고리의 다른 글

[Hello,Android] Audio, Video  (0) 2010.08.30
[tip] LogCat 문자깨짐  (0) 2010.08.18
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
익명의 내부 클래스가 만들어질 때마다 1KB의 메모리가 소요된다고 한다...

주로 클릭 처리 등의 리스너에 많이 익명의 내부 클래스로 처리하는데, 가능한한 줄이는 것도 퍼포먼스를 위한 하나의 방법일 듯

'프로그래밍 > Android' 카테고리의 다른 글

[tip] LogCat 문자깨짐  (0) 2010.08.18
[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
[Hello,Android] Activity Lifecycle  (0) 2010.06.07

[Hello,Android] WebView 사용 시

프로그래밍/Android 2010. 8. 16. 15:41 Posted by galad
[7.2 뷰가 있는 웹]에서 WebView에 setWebViewClient() 를 실행하지 않으면 WebView에서 웹페이지가 열리지 않고,
그냥 브라우저가 실행된다.(Intent로 여는 것처럼)

안드로이드OS가 버젼업되면서 바뀐 것 같지는 않고, 저자의 미스인 듯?

소스는 다음과 같다.
    private void openBrowser() {
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl(urlText.getText().toString());
        webView.setWebViewClient(new HelloWebViewClient());  // WebViewClient 지정
    }
   
   
    private class HelloWebViewClient extends WebViewClient {
       
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }



'프로그래밍 > Android' 카테고리의 다른 글

[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] 기본팁  (0) 2010.06.08
[Hello,Android] Activity Lifecycle  (0) 2010.06.07
[설치] Hello, World!  (0) 2010.05.11

[Hello,Android] 기본팁

프로그래밍/Android 2010. 6. 8. 11:15 Posted by galad
- 프로젝트 만들고, 빌드 패스 오류라고 컴파일 되지 않을 때 -> Project > Clean 실행
- 시스템 환경설정에 android-sdk/tools 디렉토리를 path에 넣어둘 것
http://developer.android.com/reference/android/app/Activity.html

- Activity가 화면 전면에 있으면(activity stack의 최상위), active/running.
- Activity가 포커스를 잃었으나 여전히 보이면(풀사이즈가 아닌 창이 뜨거나, 반투명 창이 뜨면), paused.
   모든 상태값, 멤버정보는 유지됨.
   Paused Activity는 살아있으나 메모리가 극단적으로 부족하면 시스템이 프로세스를 죽일 수 있음.
- Activity가 다른 activity에 의해 완전히 가려지면 stopped.
   모든 상태값, 멤버정보는 유지되나, 더이상 사용자에게 보이지 않으며, 메모리가 필요하면 시스템이 종종 프로세스를 죽일 수 있음.
- Activity가 paused 또는 stopped 일 경우, 시스템의 종료 요청 또는 그냥 프로세스를 죽이는 방식으로 메모리에서 삭제될 수 있음.
   이 경우 사용자에게 다시 보여지려면 완전히 다시 시작해서 기존의 상태를 복원해야 함.

- entire lifetime은 onCreate(Bundle) ~ onDestroy()
   global을 onCreate()에서 설정하고, onDestroy()에서 리소스를 해제.
   ex) 쓰레드를 onCreate()에서 만들고, onDestroy()에서 정지
- visible lifetime은 onStart() ~ onStop()
   리소스를 유지하고 사용자에게 activity를 보여줘야함.
   ex) UI에 영향을 주는 변화를 모니터하기 위해 BroadcastReceiver를 onStart()에서 등록하고 onStop()에서 해제.
   onStart()와 onStop()은 여러번 불려질 수 있음.
- foreground lifetime은 onResume() ~ onPause()
   이 사이에 activity는 다른 모든 activity보다 상위에 있고 사용자와 상호작용함.
   activity는 빈번하게 resume/pause됨.
   ex) device가 sleep모드로 되는 때, activity 결과가 전달될 때, 새 intent가 전달될 때 등. 따라서 이 메소드의 코드는 가벼워야 함.

'프로그래밍 > Android' 카테고리의 다른 글

[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
[설치] Hello, World!  (0) 2010.05.11
[설치] Android 개발 환경 설정하기  (0) 2010.04.21

[설치] Hello, World!

프로그래밍/Android 2010. 5. 11. 16:06 Posted by galad
http://developer.android.com/sdk/installing.html

1. eclipse 받기
  3.4 이상 버젼 필요.
  Java 또는 RCP 버젼이 추천됨. 3.5 버젼인 경우엔 eclipse classic 추천.

2. Android SDK 받기
  받아서 설치하기. SDK Setup 실행해서 최신으로 업데이트함.
  환경변수 설정은 필요하면 하기.

3. ADT(Android Development Tool) plugin for eclipse 설치
  링크 참조

4. Adding Android Platforms and Other Components
  SDK Setup 실행해서 원하는 컴포넌트를 선택해서 업데이트 하기
  컴포넌트에 대한 설명은 링크 참조

5. SDK 둘러보기
  링크 참조

-> Hello World~로

'프로그래밍 > Android' 카테고리의 다른 글

[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
[Hello,Android] Activity Lifecycle  (0) 2010.06.07
[설치] Hello, World!  (0) 2010.05.11