2014년 6월 29일 일요일

Android Thread, Handler, Thread Flag Start & Stop

android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views

My god, you must change your UI in main thread  but not your new thread, it is  android's rule.

안드로이드는 메인쓰래드에서만 UI를 변경해야만 한다.
자신의 새로운 thread에는 handler를 이용해야한다.

[구현]
Thread는 재시작 할 수 없으므로 Flag를 시작과 종료를 구현하고,
Handler를 통해 UI를 변경한다.


ThreadActivitiy

package com.example.threadtest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.test.R;
public class ThreadActivity extends Activity {
    private boolean bPressAndHold = false;
    private int MSG_TEST = 1;
    private TextView mTvMsg;
    private TextView mTvStatus;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_threadtest);
        mTvMsg = (TextView) findViewById(R.id.tv_msg);
        mTvStatus = (TextView) findViewById(R.id.tv_status);
        Button btGetMsgStart = (Button) findViewById(R.id.bt_get_msg_start);
        btGetMsgStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                bPressAndHold = true;
                mTvStatus.setText("Threas Start");
            }
        });
        Button btGetMsgStop = (Button) findViewById(R.id.bt_get_msg_stop);
        btGetMsgStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // bPressAndHold = false;
                bPressAndHold = false;
                mTvStatus.setText("Threas Stop");
            }
        });
        mThread.start();
    }
    Thread mThread = new Thread() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                if (bPressAndHold) {
                    Message msg = mHandler.obtainMessage();
                    msg.arg1 = MSG_TEST;
                    mHandler.sendMessage(msg);
                    SystemClock.sleep(1000);
                }
            }
        }
    };
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            if (msg.arg1 == MSG_TEST) {
                int i = Integer.parseInt((String) mTvMsg.getText());
                mTvMsg.setText(String.valueOf(i + 1));
            }
        }
    };
}


댓글 없음:

댓글 쓰기