[Android Studio]runOnUiThread

Jang Seok Woo·2021년 7월 8일
0

실무

목록 보기
28/136

https://recipes4dev.tistory.com/172

위 블로그가 정리가 잘 되어있어 올린다.

하지만 뚜렷하게 이해가 가지 않아 머릿속을 한번 정리해 보도록 하겠다.

"Only the original thread that created a view hierarchy can touch its views."

  • 안드로이드에서는 메인스레드만이 UI를 조작? 변형할 수 있다.
    즉, 눈에 보이는 화면이 변하는 것은 메인스레드만 할 수 있다. 섭스레드는 못함.

이것 때문에 여러 동작들이 부수적으로 생겨나는데,

handler, message, runOnUiThread이다.

메인스레드 즉 void main() 혹은 안드로이드의 그 MainActivity의 그 메인에서 하나의 프로세스가 돌아가고 있을 때, 동시에 다른 작업을 돌리고 싶다. -- 이런상황이 생김

예를들어, 두더지잡기 게임을 만들 때, 각 두더지는 다른 박자로 나와야하고, 두더지가 4마리라 치면 두더지 각 한마리당 하나의 프로세스로(총4개의 프로세스) 랜덤하게 튀어나와줘야한다.

message
메시지는 이러한 프로세스와 프로세스 사이에 데이터 전달이 필요할 경우에 사용된다.
두더지가 튀어나와서 해당 부분을 터치했더니 두더지가 잡혔고, 점수가 올라갔다면,
두더지가 잡혔을 때 반응 이미지도 필요할 것이고 해당 점수를 올려주는 함수 또한 필요할 것이다.

근데 여기서 잡혔을 때 반응 이미지 두더지가 아파서 눈물을 흘리는 이미지 같은걸로 바꿔줘야하는데, 안드로이드에선 이게 눈에보이는 화면(UI)부분이라 메인스레드에서만 작업이 가능하다.

그렇다면 두더지가 잡혔을 때 해당 프로세스에서 특정 데이터를 메인스레드로 넘겨주면 된다.

메인스레드에서는 데이터를 받고 두더지가 잡혔구나 하고 이미지를 교체해주던지, 함수를 써서 해결한다.

이 과정속에서 데이터 전달의 역할은 message가 한다.

그렇다면 메인스레드의 입장에서 보면, 두더지가 4마리나 있는데 잡힌 두더지가 한번에 한마리는 아닐것이다. 데이터는 잡혔다 안잡혔다 튀어나와있다 들어가있다 등 여러가지 상태를 그것도 4마리씩이나 동시에 특정 클락단위로 메인스레드를 향해 데이터를 보내고, 두더지는 이미지가 올라왔다내려갔다 울다가 숨었다가 한다.

이 데이터들은 Queue에 축적?되어 first in, first out방식으로 작동한다.
그렇다면 이 데이터들은 누가 '다루어' 주는가?

무엇에 의해 데이터는 보내졌고, 그걸 사용해야하는데 어떻게 사용하는가?
보내는 입장에선, handler.sendMessage() 핸들러로 메시지를 보내고,
받은 입장에서도 handleMessage()로 한다.
handler를 이용해서 intent처럼 데이터의 명칭과 arg를 담아서 보내고 받은 후, 그걸로 데이터를 까서? 사용한다.

자 이제 오늘의 주제 runOnUiThread를 알아보자면,
매번 액티비티에서 message를 보낼 때 handler를 선언하여 보내야 하는가?
액티비티에 이미 선언되어있는 handler가 있다면 그냥 그거 쓰면 되지 않나? 하는 생각이든다.

 public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

이런게 있다.

지금 쓰레드가 Ui쓰레드가 아니라면 돌리고
Ui쓰레드(메인스레드에서 작동해야만 하는 쓰레드)라면 메인스레드로 보내야 한다.

이게 다
"Only the original thread that created a view hierarchy can touch its views."

  • 안드로이드에서는 메인스레드만이 UI를 조작? 변형할 수 있다.
    즉, 눈에 보이는 화면이 변하는 것은 메인스레드만 할 수 있다. 섭스레드는 못함.

결국 이것 때문이다.

무튼 runOnUiThread에 대해 알아보았다.

profile
https://github.com/jsw4215

0개의 댓글