본문 바로가기

Programming/안드로이드

서브 쓰레드에서 메인 쓰레드 이용하기

글 쓰기 앞서서 쓰려고 하는 내용이 제목에 부합되는지는 정확히는 모르겠다. 

하지만 내가 알고있는 메인 쓰레드와 추가로 사용되는 쓰레드는 분명히 다르다는걸 알기에 저렇게 적어본다.

----

----

안드로이드를 사용하다가 유니티에서는 잘 사용하지 않는 몇몇가지를 경험했다.

그중에 액티비티를 생성하고 접근할때 생성한 액티비티에 static 변수를 oncreate 에서 초기화 하고 사용한다는것.

쓰레드를 사용할때 Handler를 사용한다는것.

그중에 Handler 사용법에 대해 알아보자.

A의 액티비티에서 타이머기능을 Thread로 생성하여 일정 시간이 되면 B의 액티비티의 다이얼로그를 B의 static 변수로 켜고 끄는 코드를 넣었다.

그러던중 메인 쓰레드에서 handler를 사용할수없다는 에러가 나왔다.

그리하여 구글링으로 찾는 결과 

Handler handler = new Handler (Looper.getMainLooper()) {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

.....

}

}

}

를 사용해 다른 쓰레드에서 메인 쓰레드를 사용할수 있다는 것이었다.

여기엔 Looper와 Thead의 관계 MessageQueue 등 자세히 봐야할것이 많지만

Looper,getMainLooper() 는 메인 쓰레드를 접근할수 있게 해주고 Handler안의 메인 

쓰레드 내용을 구현해 주면 된다.

 

Update

var task = Task.Run(async () => {
    while(true)
    {
        await Task.Delay(5000);

        Device.BeginInvokeOnMainThread(() =>
        {
             //do ui work    
        });
    }
});