Thread 1

박승현·2022년 4월 29일
0

cnt1 숫자 자동 올라가기

package org.techtown.practice1;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.os.Handler;

import org.w3c.dom.Text;

import java.util.Timer;

//할 일
//1. 스레드 생성 - 로직 추가
//2. 핸들러 생성


public class ThreadActivity extends AppCompatActivity {

    Button button,button2;
    TextView cnt1,cnt2;

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

        cnt1 = findViewById(R.id.cnt1);
        cnt2 = findViewById(R.id.cnt2);
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);

        //2. Thread객체생성
        TimerThread thread = new TimerThread();
        //3.Thread 실행
        thread.start();
    }

    //1.스레드 상속
    class TimerThread extends Thread {

        //5.Thread가 실행이 됐을때, 핸들러를 만들어 주고
        TimerHandler handler = new TimerHandler();

        //1-1.run
        public void run() {
            
            //1-2.기능 구현
            for (int i = 0; i < 10; i++) {
                Log.d("TimeThread", "카운트" + (i + 1));

               //4.이후 못씀  cnt1.setText(String.valueOf(i+1));
                //Handler에 값을 전달 -> Message객체
                Message msg = new Message();
                //값을 저장할 수 있는 변수 arg1,2 obj 타입에 맞게 담아두기
                msg.arg1=i+1;//★
                //Message객체 전송->핸들러 객체 이용해서 해야됨 > 핸들러 객체 생성
                //6.
                handler.sendMessage(msg);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //4.handler
    class TimerHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //()안 어떤 데이터를 받아오느냐?
            //7.msg부터 정보를 받아온 후 변수에 저장하고 괄호에 넣는다
            int count = msg.arg1;
            cnt1.setText(String.valueOf(count));
        }
    }

}

cnt2 버튼 하나 더

package org.techtown.practice1;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.os.Handler;

import org.w3c.dom.Text;

import java.util.Timer;

//할 일
//1. 스레드 생성 - 로직 추가
//2. 핸들러 생성

public class ThreadActivity extends AppCompatActivity {

    Button button,button2;
    TextView cnt1,cnt2;

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

        cnt1 = findViewById(R.id.cnt1);
        cnt2 = findViewById(R.id.cnt2);
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimerThread thread = new TimerThread();
                thread.start();
                button.setEnabled(false);

            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimerThread2 thread2 = new TimerThread2();
                thread2.start();
                button2.setEnabled(false);
            }
        });
        //2. Thread객체생성
        TimerThread thread = new TimerThread();
        //3.Thread 실행
        thread.start();

    }

    //1.스레드 상속
    class TimerThread extends Thread {

        //5.Thread가 실행이 됐을때, 핸들러를 만들어 주고
        TimerHandler handler = new TimerHandler();

        //1-1.run
        public void run() {

            //1-2.기능 구현
            for (int i = 0; i < 10; i++) {
                Log.d("TimeThread", "카운트" + (i + 1));

               //4.이후 못씀  cnt1.setText(String.valueOf(i+1));
                //Handler에 값을 전달 -> Message객체
                Message msg = new Message();
                //값을 저장할 수 있는 변수 arg1,2 obj 타입에 맞게 담아두기
                msg.arg1=i+1;//★
                //Message객체 전송->핸들러 객체 이용해서 해야됨 > 핸들러 객체 생성
                //6.
                handler.sendMessage(msg);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //4.handler
    class TimerHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //()안 어떤 데이터를 받아오느냐?
            //7.msg부터 정보를 받아온 후 변수에 저장하고 괄호에 넣는다
            int count = msg.arg1;
            cnt1.setText(String.valueOf(count));
        }
    }

    ///////////////////

    //1.스레드 상속
    class TimerThread2 extends Thread {

        //5.Thread가 실행이 됐을때, 핸들러를 만들어 주고
        TimerHandler2 handler = new TimerHandler2();

        //1-1.run
        public void run() {

            //1-2.기능 구현
            for (int i = 0; i < 10; i++) {
                Log.d("TimeThread", "카운트" + (i + 1));

                //4.이후 못씀  cnt1.setText(String.valueOf(i+1));
                //Handler에 값을 전달 -> Message객체
                Message msg = new Message();
                //값을 저장할 수 있는 변수 arg1,2 obj 타입에 맞게 담아두기
                msg.arg1=i+1;//★
                //Message객체 전송->핸들러 객체 이용해서 해야됨 > 핸들러 객체 생성
                //6.
                handler.sendMessage(msg);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //4.handler
    class TimerHandler2 extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //()안 어떤 데이터를 받아오느냐?
            //7.msg부터 정보를 받아온 후 변수에 저장하고 괄호에 넣는다
            int count = msg.arg1;
            cnt2.setText(String.valueOf(count));
        }
    }

    /////////////////
}

thread 하나로

package org.techtown.practice1;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.os.Handler;

import org.w3c.dom.Text;

import java.util.Timer;

//할 일
//1. 스레드 생성 - 로직 추가
//2. 핸들러 생성

public class ThreadActivity extends AppCompatActivity {

    Button button,button2;
    TextView cnt1,cnt2;

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

        cnt1 = findViewById(R.id.cnt1);
        cnt2 = findViewById(R.id.cnt2);
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //10-6.괄호 안 데이터 넣기
                TimerThread thread = new TimerThread(cnt1);
                thread.start();
                button.setEnabled(false);

            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimerThread thread2 = new TimerThread(cnt2);
                thread2.start();
                button2.setEnabled(false);
            }
        });

        //2. Thread객체생성 11
        //TimerThread thread = new TimerThread();
        //3.Thread 실행
        //thread.start();

    }

    //1.스레드 상속
    class TimerThread extends Thread {

        //5.Thread가 실행이 됐을때, 핸들러를 만들어 주고
        TimerHandler handler = new TimerHandler();

        //10.thread 하나만 이용하는 방법
        //10-2 텍스트 뷰 선언
        TextView tv;

        //10-1.생성자 생성 역할)초기 초기화 클래스 내부에 정의된  필드의 변수들을 초기화 > 초기화되면 객체생성시 객체들은 값을 가지는 역할
        public TimerThread(TextView tv){
            this.tv = tv;
        }

        //1-1.run
        public void run() {

            //1-2.기능 구현
            for (int i = 0; i < 10; i++) {
                Log.d("TimeThread", "카운트" + (i + 1));

               //4.이후 못씀  cnt1.setText(String.valueOf(i+1));
                //Handler에 값을 전달 -> Message객체
                Message msg = new Message();
                //값을 저장할 수 있는 변수 arg1,2 obj 타입에 맞게 담아두기
                msg.arg1=i+1;//★
                //10-2.텍스트뷰 저장
                msg.obj = tv;
                //Message객체 전송->핸들러 객체 이용해서 해야됨 > 핸들러 객체 생성
                //6.
                handler.sendMessage(msg);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //4.handler
    class TimerHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //()안 어떤 데이터를 받아오느냐?
            //7.msg부터 정보를 받아온 후 변수에 저장하고 괄호에 넣는다
            int count = msg.arg1;

            //10-3.obj타입으로 업캐스팅되어 저장됐으니 다운캐스팅 해야함
            TextView tv = (TextView) msg.obj;

            //cnt1.setText(String.valueOf(count));
            //10-4. timerThreasd객체 생성 시 넘겨받은 Textview객체에 내용을 업데이트 (이제 위로 올라가 오류!)
            tv.setText(String.valueOf(count));
        }
    }

    /////////////////// 11. 노필요!

    //1.스레드 상속
    class TimerThread2 extends Thread {

        //5.Thread가 실행이 됐을때, 핸들러를 만들어 주고
        TimerHandler2 handler = new TimerHandler2();

        //1-1.run
        public void run() {

            //1-2.기능 구현
            for (int i = 0; i < 10; i++) {
                Log.d("TimeThread", "카운트" + (i + 1));

                //4.이후 못씀  cnt1.setText(String.valueOf(i+1));
                //Handler에 값을 전달 -> Message객체
                Message msg = new Message();
                //값을 저장할 수 있는 변수 arg1,2 obj 타입에 맞게 담아두기
                msg.arg1=i+1;//★
                //Message객체 전송->핸들러 객체 이용해서 해야됨 > 핸들러 객체 생성
                //6.
                handler.sendMessage(msg);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //4.handler
    class TimerHandler2 extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //()안 어떤 데이터를 받아오느냐?
            //7.msg부터 정보를 받아온 후 변수에 저장하고 괄호에 넣는다
            int count = msg.arg1;
            cnt2.setText(String.valueOf(count));
        }
    }

    /////////////////
}

0개의 댓글