사용 버전 : API 19

사용 도구 : Android Studio 1.3.1


1. Sub Thread의 생성자 매개변수로 변경할 위젯을 받아 저장한뒤 Post로 수정

  -> 실코딩에선 부적합


2. Interface를 이용한 Callback 메소드로 수정

  -> 단일 처리밖에 안됨

1
2
3
4
5
6
7
8
9
10
11
    private ProcessCallback m_Callback = new ProcessCallback() {
        @Override
        public void callback(final String result) {
            tvResult.post(new Runnable() {
                @Override
                public void run() {
                    tvResult.setText(result);
                }
            });
        }
    };
cs

▲MainActivity.java

MainActivity에 Interface인 ProcessCallback 객체를 생성후 callback 메소드를 구현한다.

1번 방법을 사용할 경우 위에서 post 메소드만 때서 Sub Thread의 run에 넣어주면 된다.


1
2
3
4
5
6
7
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProcessThread thread = new ProcessThread(m_Callback);
                thread.start();
            }
        });
cs

▲MainActivity.java

btn1를 클릭하면 Thread를 상속받은 ProcessThread 객체를 생성할때 m_CallBack을 넘겨주고 Thread 시작


1
2
3
4
5
6
7
8
9
10
11
    @Override
    public void run() {
        StringBuffer result = new StringBuffer();
        try {
            sleep(5000);
            result.append("Process Result");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        m_Callback.callback(result.toString());
    }
cs

▲ProcessThread.java

callback 메소드로 UI 수정


3. Handler를 이용한 UI 수정 

  -> 다중처리 가능


1
2
3
4
5
6
7
8
9
10
11
12
13
    private Handler m_Handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 0) {
                String data = msg.getData().getString("result");
                tvResult.setText(data);
            }
            else if( msg.what == 1)
            {
 
            }
        }
    };
cs

▲MainActivity.java

MainActivity에 Handler 객체를 생성, 이 Handler는 Main Thread에서 동작한다.

1
2
3
4
5
6
7
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProcessThread2 thread = new ProcessThread2(m_Handler);
                thread.start();
            }
        });
cs

btn2를 클릭시 ProcessThread2 객체를 생성하고 실행한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    @Override
    public void run() {
        StringBuffer result = new StringBuffer();
        try {
            sleep(5000);
            result.append("Process Result");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Message message = new Message();
 
        Bundle bundle = new Bundle();
        bundle.putString("result", result.toString());
        message.setData(bundle);
 
        message.what = MainActivity.REUSLT_OK;
        message.setTarget(m_Handler);
        message.sendToTarget();
 
    }
cs

▲ProcessThread2.java

보낼 Message를 생성하고 보낸다.(데이터를 넣기 위해서 Bundle을 생성하여 데이터를 넣는다.)


AndroidThreadTest.zip


+ Recent posts