• Daum
  • |
  • 카페
  • |
  • 테이블
  • |
  • 메일
  • |
  • 카페앱 설치
 
슈퍼드로이드
 
 
 
카페 게시글
검색이 허용된 게시물입니다.
안드로이드 기본 강좌 16. Activity에 대해서 - Thread 와 Android Main Thread
슈퍼성근 추천 13 조회 13,032 11.07.04 11:17 댓글 28
게시글 본문내용
 
다음검색
첨부된 파일
댓글
  • 12.02.08 03:29

    첫댓글 스레드와 핸들러의 구분을 조금이나마 명확하게 이해를 했습니다. 감사합니다. ^^

  • 12.04.04 16:32

    내용을 명확히 이해하지 못해서 이런 질문을 하는지는 모르겠습니다. thread와 thread간의 통신을 위해서 messageque와 handler가 필요할까요? 기본적으로 process내의 thread와 main thread는 서로의 영역의 접근과 data공유가 가능하지 않았나요? 만약 그렇다면 굳이 메시지를 보낼 필요가 있는지 모르겠어요. 메시지의 type이 parcelable이란건 다른 process에 있는 thread들끼리 통신할 수 있다는 말로 들리는데요. 좀 햇갈리네요.

  • 작성자 12.04.04 18:32

    안녕하세요.
    Thread 간의 통신을 위해 message queue를 말씀드린것이 아닙니다.
    위에 좀더 자세히 보시면 Main Thread에 무엇을 시킬때 handler를 사용하면 편리하다는 것이고
    따로 메모리가 Thread간은 공유하기 때문에 변수등을 사용하셔도 됩니다.
    Handler의 편리함은 꼭한번 위의 내용을 확인해 주셨으면 좋겠네요.

    또한 Message 객체가 parcelable인 이유가 있습니다. 다른 Process에서
    해당 Process의 Thread로 Message를 전송하여 Queue에 집어 넣을 수도 있습니다.
    그러므로 Message 객체는 Process 통신이 되어야 합니다. ^^

  • 12.04.04 21:49

    아직 다 읽진 못했는데요. 구글링좀 하고 이해를 해봤는데요. 우선 뒤에 message부터, 말씀하신데로 다른 프로세스의 thread가 다른 process의 thread와 통신하는(예를들면 채팅같이) 경우는 당연히 parcelable이 아니면 채팅할 수 없으니까..parcelable이 되야 하는게 쏙들어오네요. 그리고 main thread는 기본적으로 message que가 제공이 되네요..그리고 working thread는 message queue가 제공이 안되서 loop를 만들면 안에서 message que가 생겨서 main thread와 message를 주고 받을수가 있네요. 즉 말씀의 주안점은 main thread(UI thread)의 message que와 일반 working thread의 메시지 교환방식이 갖는 편리함을 쓰신거같아요.맞나요?

  • 작성자 12.04.05 13:32

    네 정확히 전달하고자 한 사항은

    1. Main Thread에서는 화면에 그리는 작업이 가능하다는 점

    2. 다른 Thread에서는 그리는 작업을 할 수 없다는 점
    (왜 다른 Thread에서는 그리는 작업을 할 수 없는지는
    위에 설명을 참조하세요.)

    3. 다른 Thread에서 그리는 작업을 할 수 없으니
    Main Thread에서 그 작업을 하도록 시켜야 한다는 점

    4. Main Thread에서 작업을 시키기 위한 좋은 객체가 존재하며,
    바로 그 객체가 HandlerThread라는 점.
    (그러므로 MainThread에서는 HandlerThread 가 존재한다)

    !!! 참고로 HandlerThread는 Thread를 상속 받았습니다.
    그러므로 HandlerThread도 Thread입니다.

  • 작성자 12.04.05 13:36

    일반적인 Thread를 확장해서 만든 HandlerThread의 강력한 기능이
    바로 Looper와 MessageQueue입니다.
    작업을 순차적으로 처리할 수 있는 스케쥴 기능이 있으니까요.
    그러므로 해당 기능의 장점이 필요한 경우
    어느 곳에서나 적용하여 사용하시면 됩니다.
    즉 내 코드에서 HandlerThread의 스케쥴 개념이 필요하시다면
    객체를 생성하여 사용하시면 됩니다.
    이 장점을 선택한 것이 바로 MainThread인 것이죠.

    저의 강좌가 직관적이지 못했나 봅니다. ^^ 죄송합니다.

  • 12.04.05 14:06

    슈퍼성근님의 강좌는 제가 생각하는 방식으로 공부를 하는 사람중에 한분이세요. 그래서 대부분의 강의는 술술 잘읽히고 본질을 놓치고 있지 않다고 생각해요. 저도 그렇게 공부를 하고 있거든요. 근데..이 강좌는 좀 어렵다는 느낌이 들었어요. 기존 강의처럼 친절한 설명과 구체적으로 설명하셨어요. 어쩌면 다른강좌는 제가 background가 있는데 이강좌는 아니였는지 모르겠어요. 강좌시작전에 UI thread와 thread의 차이를 설명하셨으면 이해가 더 쉬웠을꺼 같아요. UI thread는 messageque(in-looper) 와 그냥 working thread에 대한 차이가 있고, working thread안에 looper를 다는것 그리고 Handler를 추가한다는...

  • 12.04.05 14:09

    어떻게 보면 슈퍼성근님입장에선 당연한 내용이지만, 첨 접할때는 햇갈릴수가 있거든요. 저는..Handler 그냥 project 생성하고 activity안에 만들면 어떻게 되는거지? looper도 따로 만들어야 하나...만들면 연결을 어떻게 해야 하나...looper하고 handler는 다만들어주는건가 아니면 안드로이드에서 제공이 되는건가? 이런 고민했는데요.물론 성근님 강좌를 읽으면 다 나오는 얘기지만 첨 부분에서 혼란이 생기니까..강좌를 쫒아가지 않고 구글링을 하고 다시 왔습니다. 강좌는 역시 최고...

  • 작성자 12.04.05 15:40

    많은 조언 감사드립니다.
    더욱 많은 조언 부탁드리며, 질 좋은 강좌로 보답해 드리겠습니다.
    감사합니다.

  • 12.09.10 13:47

    3.3 AsyncTask 부분에
    이 말은 즉 UI 작업을 함수 있는 함수라는 것이다.
    오타발견이요 ~ 할수 있는 함수

  • 13.01.23 21:36

    Message 객체에 target, callback 필드는 버전이 올라가면서 없어진 것인가요? 이것에 대한 질문을 한참을 고민하며 작성할려고 하려던 찰나 안드로이드 api 문서의 Message 부분에는 저 필드를 찾을 수가 없네요

  • 작성자 13.01.23 23:20

    제 강좌에서 설명이 많이 부족했던것 같습니다.

    먼저 callback과 target은 Message.obtain() 함수를 통해서 사용할 수 있습니다.

    원형은 아래와 같습니다.
    public static Message obtain(Handler h, Runnable callback) {
    Message m = obtain();
    m.target = h;
    m.callback = callback;

    return m;
    }

    위의 framework 원형 함수에서 인자 callback, h 가 바로 그 값을 설정하는 것입니다.

  • 작성자 13.01.23 23:22

    그 다음 Target만 설정하는

    원형함수는

    public static Message obtain(Handler h) {
    Message m = obtain();
    m.target = h;

    return m;
    }
    와 같이 추가할 수 있습니다.
    위에 인자에서 Handler h 가 바로 target이 됩니다.

    뿐만아니라 obtain의 오버로딩 함수들을 보시면
    해당 값들을 설정하는 다양한 함수를 제공하고 있습니다.

    감사합니다.

  • 13.03.27 16:42

    AsyncTask와 Handler를 생각없이 쓰는 일이 많았는데, 본질적인 부분을 정리해주셨네요. 감사합니다.
    AsyncTask는 웹 API를 호출해서 결과값을 가져오는 처리에서 정말 많이 쓰곤하죠. ㅎㅎ

  • 작성자 13.03.27 17:22

    감사합니다. ^^

  • 14.01.16 17:16

    Thread와 Handler에 대해서는 알고 있었지만 HandlerThread의 존재에 대해서는 전혀 모르고 있었네요^^;;
    좋은 강좌 정말 정말 감사합니다~~

  • 14.01.21 17:27

    오타가 있네요 ㅎㅎ OnCancelled 콜백이 OnCacelled 라고 두번이나! ^^;

  • 작성자 14.01.21 23:33

    감사합니다. ^^; 수정되었습니다.

  • 14.02.07 15:54

    슈퍼성근님.. 존경합니다.
    대단하시네요...

  • 작성자 14.02.10 13:04

    과찬이십니다 ^^; 감사합니다.

  • 14.02.24 11:33

    "그리는 순서는 꼿 1,2,3 번 순서로 그려야 한다."
    라는 매우 귀여운 오타를 발견했습니다 ㅋㅋㅋㅋㅋ
    '꼿'이라는 글자가 왜이리 귀여워보일까요
    읽는데 아무 지장이 없는 오타지만 꼿 이 눈에 딱 보여서 댓글남깁니다~~~

    ps. 암기하듯이 알고있던부분을 원리를 이해하게 되었습니당 역시 슈퍼성근님!! 짱입니다乃

  • 작성자 14.02.24 12:56

    ^^ 대단히 감사드립니다.

    그냥 귀찮아서 지나칠 수 있지만, 이렇게 글을 남겨 주시는 것을 보면
    카페를 매우 아껴 주시는 분임이 분명한 것 같습니다.

    수정하였습니다. 다시 한번 감사드립니다. ^^b

  • 14.03.11 01:32

    thread 와 handler로 구성하는것보다
    asynctask로 구성하는게 쉬워보이는데요
    장단점이 있을까요?
    asynctask 로만 구성해도 될듯한데요
    참고로 제어플에서 thread 와 handler로 구성했더니 가끔 죽는경우가 많이 생겨서 당황스럽습니다.

  • 작성자 14.03.12 10:15

    안녕하세요. ^^

    둘의 장단점을 제시할 수는 없습니다.
    그 이유는 thread + handler 를 좀더 편하게 사용할 수 있도록 나온것이 AsyncTask이기 때문입니다.
    따라서 개발하시는 프로젝트에 맞게 사용하시면 되겠네요.

    단 AsyncTask는 UI Thread와 작업 Thread에서 처리해야 할 일들을
    함수로 명확히 구분해 주기 때문에 개발자의 실수를 많이 줄어줍니다.
    또한 사용도 편하죠.
    AsyncTask 구조를 사용할 수 없는 경우가 아니라면
    최대한 AsyncTask를 활용해 보세요.

  • 15.01.06 06:10

    @슈퍼성근 제가 얼핏 주워들은 얘기로는 AsyncTask 내부적으로는 Thread를 쓰는데 생성 갯수에 제한을 두고 있다고 들었습니다. 즉, 아무리 많은 AsyncTask를 생성해서 수행해도 내부적으로는 지정된 Thread개수를 초과하지 않게 수행이 되어 process overhead (소위, 죽는..)가 나는 경우를 방지한다고 들었습니다.

  • 작성자 15.01.06 12:31

    @juniano 좋은 정보 감사합니다. 덧붙입니다.

    AsyncTask는 내부적으로 Thread pool을 가집니다.
    쉽게 말하자면 동시에 스레드를 생성해서 돌리는 최대 개수가 있습니다.
    공식은 아래와 같습니다.

    단말기의 CPU 개수 * 2 + 1
    즉 단말기에 CPU 개수가 4개라면 9개의 스레드가 동시에 돌아갑니다.
    만일 초과하면 다른 스레드가 끝날때까지 대기하게 됩니다.

    사실 Thread를 무작정 많이 생성하여 돌린다고 속도가 빨라지는 것이 아닙니다.
    오히려 스레드 개수가 많으면 overhead가 생기죠.
    따라서 스레드 개수는 적정선을 두고 돌리는 것이 이상적입니다.
    그래서 위와 같은 스레드 생성 개수 제한 공식이 필요한 것입니다.

  • 작성자 15.01.06 12:33

    @슈퍼성근 하지만 사용자 입장에서는 내부 구조를 무시하시고 사용해도 됩니다.
    내부적으로 적절히 스레드를 생성하고 동작시켜 주기 때문입니다.

    여기서 오해할 수 있는 내용이 있는데요.
    AsyncTask 하나는 Thread 하나입니다.
    하나의 AsyncTask 객체가 여러개의 Thread를 생성하는 것이 아닙니다.
    위에서 말한 것은 AsyncTask 객체를 100개 생성하고 동시에 돌릴때
    각 객체만큼 Thread가 막 생기는게 아니라는 말입니다.

    수고하세요.

  • 15.01.06 13:09

    @슈퍼성근 역시 대단하십니다. 사실 윗 답글을 적을 때 슈퍼성근님께 자세한 내용 알려주십사 부탁드리려 했는데 저도 주워들은 내용이라 제 답변 자체에 확신이 없어서 (혹시 틀린 내용일까봐서요 ㅎㅎ) 그 내용은 안 적었었습니다. 하지만 역시 기대를 저버리지 않으시는군요.. 감사합니다.

최신목록