프로그래밍/안드로이드

[안드로이드] Thread(쓰레드)에서 UI 변경하기 - runOnUiThread 사용하기

오치리일상 2017. 8. 20.

안드로이드는 UI 작업(업데이트)시에는 특정 UI Thread에서 사용하도록 되어있다. 

 

그래서 UI Thread가 아닌 Thread에서 사용하면 오류가 발한다.

 

이 때 Thread에서 UI작업을 할 수 있는 방법에 대해 알아본다.

 


 

 

UI Thread를 구현하는 코드는 꽤 간단하다.

 

Sub Thread 에서 UI작업시  runOnUiThread()를 사용한다.

 

 

 

사용예는 아래와 같다.

 

runOnUiThread(new Runnable() {
@Override
public void run() {
// 이 곳에 UI작업을 한다
}
});

 

 

실제 Thread에서 runOnUiThread를 사용하는 샘플 프로젝트 소스를 살펴본다. 

 

* activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.studio572.samplerunonuithread.MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="center"
        android:textSize="25dp"
        android:textColor="#000000"
        android:text="UI 변경전.."/>

    <Button
        android:id="@+id/button01"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="Thread에서 UI 변경하는 메소드 호출"/>
    <Button
        android:id="@+id/button02"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="Thread에서 UI 변경을 위한 runOnUiThread를 사용한 메소드 호출"/>
</LinearLayout>

 

 

 

 

 

 

 

* MainActivity.java

package com.studio572.samplerunonuithread;

import android.graphics.Color;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private Button button01, button02;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
        button01 = (Button) findViewById(R.id.button01);
        button02 = (Button) findViewById(R.id.button02);

        button01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Thread를 생성한다.
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // Thread 안에서 바로 UI작업을 한다.
                        textView.setText("Thread에서 UI 변경하는 메소드 호출");
                        textView.setBackgroundColor(Color.BLUE);
                    }
                }).start();
            }
        });
        button02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Thread를 생성한다.
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // runOnUiThread를 추가하고 그 안에 UI작업을 한다.
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText("Thread에서 UI 변경을 위한 runOnUiThread를 사용한 메소드 호출");
                                textView.setBackgroundColor(Color.GREEN);
                            }
                        });
                    }
                }).start();
            }
        });
    }
}

 

위 코드 실행화면은 위에 유트브 동영상에서 볼 수 있다.

 

button01을 클릭시에는 Thread안에 다른 작업없이 TextView.setText()와 TextView.setBackground() 메소드로 UI작업을 시도한다. 

 

하지만 이는 곧 오류를 발생시킨다.

 

button02를 클릭시에는 Thread안에 UI Thread인 runOnUiThread를 넣어주고 이 안에서 TextView.setText()와 TextView.setBackground()메소드를 호출한다.

 

그리고 텍스트와 배경색이 오류없이 업데이트되는 것을 확인할 수 있다.

 

그럼 즐코딩 하세요~

 

 

댓글

💲 추천 글