안드로이드 이론 빡공 25
본문 바로가기
안드로이드(Android)

안드로이드 이론 빡공 25

by KyeongMin 2020. 7. 20.
728x90
반응형

 

**MainActivity.java**

package com.threedpit.mythread;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView textView;

    MainHandler handler;

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

        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                BackgroundThread thread = new BackgroundThread() ;
                thread.start();//run의 메소드안에 있는것이 실행된다.
            }
        });
        handler = new MainHandler();
    }
    //가장기본적인게 쓰레드를 상속한 클래스 정의해서 그클래스로 객체 만들어 시작
    class BackgroundThread extends Thread{
        public void run(){//이 메소드는 쓰레드를 시작하면 run 매소드 자동실행
            int value =0;
            for(int i =0; i<100;i++){
                try {
                    Thread.sleep(1000);//1 초동안 쉬기
                }catch (Exception e){};//sleep 이 예외가 생길수 있으므로 예외처리를 해줘야한다.
                value+=1;
                Log.d("MyThread","value : "+value);//1초에 한번씩 출력하는 예제
                //textView.setText("값 : "+ value);
                // 이렇게 그냥 쓰는경우에는 메인쓰레드에서 원래 view에
                //접근을 하는데 그렇게 되면 동시접근으로 인해서 문제가 발생한다.
                //그래서 handler를 사용하여 main쓰레드에서 순서대로 작업을 해준다

               Message message =  handler.obtainMessage();
               Bundle bundle = new Bundle();
               bundle.putInt("value",value);
               message.setData(bundle);
               handler.sendMessage(message); //이렇게 해서 우선 핸들러로 넘겨줘야한다.
            }
        }
    }
    class MainHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //핸들러 쪽으로 메세지를 보내는데 이것은 메인스레드에서 동작을 하게 된다.
            //동시접근의 문제를 해결 할 수 있다.
            super.handleMessage(msg);
           Bundle bundle=msg.getData(); //아까 bundle에넣어message로 보낸것이 여기로 전달된다.
            int value = bundle.getInt("value");
            textView.setText("value : "+value);
        }
    }

}

**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=".MainActivity" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="쓰레드 시작하기" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="값 : 0"
        android:textSize="30sp" />

</LinearLayout>

 

**MainActivity.java**

package com.threedpit.mythread;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView textView;

    //MainHandler handler;
    Handler handler = new Handler();

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

        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                BackgroundThread thread = new BackgroundThread() ;
                thread.start();//run의 메소드안에 있는것이 실행된다.
            }
        });
        //handler = new MainHandler();
    }
    //가장기본적인게 쓰레드를 상속한 클래스 정의해서 그클래스로 객체 만들어 시작
    class BackgroundThread extends Thread{
        public void run(){//이 메소드는 쓰레드를 시작하면 run 매소드 자동실행
            int value = 0;
            for(int i =0; i<100;i++){
                try {
                    Thread.sleep(1000);//1 초동안 쉬기
                }catch (Exception e){};//sleep 이 예외가 생길수 있으므로 예외처리를 해줘야한다.
                value+=1;
                Log.d("MyThread","value : "+value);//1초에 한번씩 출력하는 예제
                final int finalValue = value;
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("값 : "+ finalValue);
                    }
                });
                //textView.setText("값 : "+ value);
                // 이렇게 그냥 쓰는경우에는 메인쓰레드에서 원래 view에
                //접근을 하는데 그렇게 되면 동시접근으로 인해서 문제가 발생한다.
                //그래서 handler를 사용하여 main쓰레드에서 순서대로 작업을 해준다

              /* Message message =  handler.obtainMessage();
               Bundle bundle = new Bundle();
               bundle.putInt("value",value);
               message.setData(bundle);
               handler.sendMessage(message); //이렇게 해서 우선 핸들러로 넘겨줘야한다.*/

            }
        }
    }
    /*
    class MainHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //핸들러 쪽으로 메세지를 보내는데 이것은 메인스레드에서 동작을 하게 된다.
            //동시접근의 문제를 해결 할 수 있다.
            super.handleMessage(msg);
           Bundle bundle=msg.getData(); //아까 bundle에넣어message로 보낸것이 여기로 전달된다.
            int value = bundle.getInt("value");
            textView.setText("value : "+value);
        }
    }*/

}

 

728x90
반응형

'안드로이드(Android)' 카테고리의 다른 글

안드로이드 이론 빡공 27  (0) 2020.07.22
안드로이드 이론 빡공26  (0) 2020.07.21
안드로이드 이론 빡공 24  (0) 2020.07.17
안드로이드 이론 빡공 23  (0) 2020.07.14
안드로이드 이론 빡공 22  (0) 2020.07.07

댓글