Android Programming

[Mobile Programming] 스레드

gangintheremark 2021. 12. 10. 05:28
728x90

스레드

  • 배경 음악이 플레이 되면서 동시에 액티비티 화면의 사용자 인터페이스 조작 작업
  • 실행과정에서 서로 영향을 미치지 않고 독립적으로 수행되는 작업에 대해서만 사용
  • 각각의 프로세서가 서로 다른 작업 → 동시 진행
new Thread() {
    public void run() {
        // 이 부분에 작업을 코딩
    }
 }.start();
 // new로 표현된 객체를 만드는 순간 thread가 실행
  • 일반적 스레드 : 스레드 안에서 필요한 내용을 계산하는 것만 가능
  • UI 스레드 : 화면의 위젯 내용 변경 가능
runOnUiThread(new Runnable() {
    public void run() {
        // 위젯을 변경하는 작업 프로그램
    }
};

실습1

  • SeekBar에서 현재의 진행 상황을 서로 다르게 진행하도록 해주는 작업
public class MainActivity extends AppCompatActivity {

    ProgressBar myseekbar1, myseekbar2;
    Button btn;

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

        myseekbar1 = (ProgressBar)findViewById(R.id.seekBar);
        myseekbar2 = (ProgressBar)findViewById(R.id.seekBar2);
        btn = (Button)findViewById(R.id.button);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread() {
                    public void run() {
                        for(int i= myseekbar1.getProgress(); i<100; i+=2) {
                            myseekbar1.setProgress(myseekbar1.getProgress() + 2);
                            SystemClock.sleep(100); // for 문 반복 전 잠시 쉬었다가 진행
                        }
                    }
                }.start();

                new Thread() {
                    public void  run() {
                        for(int i=myseekbar2.getProgress(); i< 100 ; i ++) {
                            myseekbar2.setProgress(myseekbar2.getProgress() + 1);
                            SystemClock.sleep(100); 
                        }
                    }
                }.start();
            }
        });
    }
}

실습 1 실행결과

습 2

  • 실습 1 내용의 위젯 내용을 변경 → UI 스레드 사용
public class MainActivity extends AppCompatActivity {

    ProgressBar myseekbar1, myseekbar2;
    Button btn;
    TextView tv1, tv2;

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

        myseekbar1 = (ProgressBar)findViewById(R.id.seekBar);
        myseekbar2 = (ProgressBar)findViewById(R.id.seekBar2);
        btn = (Button)findViewById(R.id.button);
        tv1 = (TextView)findViewById(R.id.textView);
        tv2 = (TextView)findViewById(R.id.textView2);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread() {
                    public void run() {
                        for(int i= myseekbar1.getProgress(); i<100; i+=2) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    myseekbar1.setProgress(myseekbar1.getProgress() +2);
                                    tv1.setText("1번 SeekBar 진행률 : " + myseekbar1.getProgress() + "%");
                                }
                            });
                            SystemClock.sleep(100); // for 문 반복 전 잠시 쉬었다가 진행
                        }
                    }
                }.start();

                new Thread() {
                    public void  run() {
                        for(int i=myseekbar2.getProgress(); i< 100 ; i ++) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    myseekbar2.setProgress(myseekbar2.getProgress() + 1);
                                    tv2.setText("2번 SeekBar 진행률 : "+ myseekbar2.getProgress() + "%");
                                }
                            });
                            SystemClock.sleep(100);
                        }
                    }
                }.start();
            }
        });
    }
}

실습 2 실행결과&nbsp;

728x90