Runnable객체 실행 방식

그냥 쉽게 말해서,,,

핸들러.post(new Runnable(){~~textv,setText("안녕"); ~~~})  이렇게 하고

UI 바꾸는 코드 쓰면 그냥 UI 잘 바뀜

 

 

 

-설명-

이전 게시글에서 CountHandler클래스는 이제 필요가 없으므로,

일반적으로 사용하는 Handler클래스를 이용해서 객체를 생성한다.

그대신에

핸들러를 이용해 전달할 Runnalbe클래스를 새로 정의하여 반복적으로 사용할 수 있도록 한다.

 

CountRunnable클래스는 Runnable클래스를 상속해서 정의했으면

run()메소드 안에는 이전 게시글에서 사용했던 handleMessage()메소드 안의 코드를 그대로 넣어 동일한 기능을 수행하도록 한다.

onCreate()메소드 안에서 CountRunnable객체를 하나 만들고 나면 

이 객체는 새로 생성한 스레드에서 사용하게 된다!!!!!!

 

이제 새로 생성한 스레드인 thread1의 run()메소드 안에서는 Handler 객체의 post()메소드를 호출할 때 파라미터로 전달되는 CountRunnable객체를 볼 수 있다.

 

다음은 Runnable객체와 핸들러 클래스의 post()메소드를 이용해서 메인 스레드에서 진행률(숫자 올라가는거)을 표시하는 메인 액티비티의 코드이다.

이전 게시물에서 핸들러의 메시지 전송 방식을 사용했을 때의 코드와 거의 동일하고 핸들러를 사용하는 방식만 바뀌 었다.

 

 

 

 

 

 

-설명 요약-

 

 

 

 

 

-과정-

(설명 요약 번호랑 그림이랑 같이 보면됨)

1. 이전 게시글에서 CountHandler클래스는 이제 필요가 없다 (안쓸거임)

그냥 주석 달면됨

 

2. 그래서 일반적으로 사용하는 “Handler 클래스를 이용해 객체 생성한다!!!

 

3. “2(핸들러)”을 생성 한 다음에 “2(핸들러)” 이용해 전달할 “Runnable클래스를 새로 정의하여 반복적으로 사용 할 수 있도록 한다

 

4. CountRunnable클래스 Runnalbe클래스를 상속하여 정의하였으면 “run()메소드 안에는 
이전 게시물에서 사용했던 handleMessage()메소드 안의 코드를 넣는다. - (조금 수정)

 

5. onCreate()메소드 안에서 CountRunnable객체 하나를 만들고 나면 이 객체는 새로 생성한 스레드에서 사용하게 된다.

 

6. (버튼 클릭 기능 추가 -> 클릭하면 1씩증가)

   이제 새로 생성한 스레드인 thread1 run()메소드 안에서는 “Handler객체의 post()메소드를 호출할 때

   파라미터로 전달되는 CountRunnable객체를 볼 수 있다(결과를 화면에서 볼 수 있다는거).

67라인  }

 

 

 

 

(위 코드는 스레드 하나만 돌려서 버튼 클릭 시, 값 1씩 증가해서 출력)

 

 

 


 

 

 

(아래 코드는 스레드 두개 돌려서 버튼 클릭 시, 하나는 값 1씩 증가, 다른 하나는 값 1씩 감소해서 출력)

public class Two extends AppCompatActivity {

    TextView num1 ,num22;
    int count, count2;          // 숫자
//    CountHandler hand;  // 예전꺼 "핸들러"임 (만든거)           1.사용 안할꺼니깐 (주석)
    Handler hand;
    Button btn1;
    CountRunnable countrunnable;
    Count1Runnable count1runnable;

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

        num1 =findViewById(R.id.num1);
        num22 =findViewById(R.id.num22);
        btn1 =findViewById(R.id.btn1);

        hand = new Handler();                                // 2.핸들러 생성
        countrunnable = new CountRunnable();                 // 5.사용할 Runnable객체 하나 만듬.
        count1runnable = new Count1Runnable();

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread1 = new Thread(new Runnable() {        // 6.새로운 thread생성 후,  Handler객체의 post()이용해서
                    @Override                                        // 파라미터로 CountRunnable객체의 실행 결과를 볼 수 있다.
                    public void run() {
                        hand.post(countrunnable);
                        hand.post(count1runnable);
                    }
                });
                thread1.start();
            }
        });
    }

    public class CountRunnable implements Runnable{    // 3."Runnable클래스”를 새로 정의하여 반복적으로 사용 할 수 있도록 한다
        @Override
        public void run() {

            try {                     // 4. 넣음
                count++;
                num1.setText(count + "");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Toast.makeText(getApplicationContext(), (CharSequence) e,Toast.LENGTH_LONG).show();
            }

        }
    }

    public class Count1Runnable implements Runnable{    // 3."Runnable클래스”를 새로 정의하여 반복적으로 사용 할 수 있도록 한다
        @Override
        public void run() {

            try {                      // 4. 넣음
                count2--;
                num22.setText(count2 + "");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Toast.makeText(getApplicationContext(), (CharSequence) e,Toast.LENGTH_LONG).show();
            }
        }
    }
}

결과

 

 

 


 

 

 

 

(아래 코드는 이미지 5개 스레드 돌린거)

안드로이드 웃는 이미지 5개를 스레드 돌린거

public class MainActivity extends AppCompatActivity {
    ImageView imgv;
    ArrayList<Drawable> drawlist = new ArrayList<Drawable>();
    Handler handler = new Handler(); 
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgv = findViewById(R.id.imgv);

        startimgAnimation();
    }

    public void startimgAnimation(){
        Resources res = getResources();

        drawlist.add(res.getDrawable(R.drawable.emo1));
        drawlist.add(res.getDrawable(R.drawable.emo2));
        drawlist.add(res.getDrawable(R.drawable.emo3));
        drawlist.add(res.getDrawable(R.drawable.emo4));
        drawlist.add(res.getDrawable(R.drawable.emo5));

        AniThread thread = new AniThread();
        thread.start();
    }

    Class AniThread extends Thread{
        public void run(){
            int index = 0;
            for(int i=0;i<100;i++){
                fincal Drawable draw = drawlist.get(index);
                index += 1;
                if(index>4){
                    index =0;
                }

                handler.post(new Runnable(){
                    public void run(){
                        imgv.setImageDrawable(draw);
                    }
                });
                try{
                    Thread.sleep(500);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

 

 

 

 

 

 


 

 

 

 

 

 

 

 

1.여기 블로그 내용 좋음

https://brunch.co.kr/@mystoryg/84

 

 

 

 

2.여기 블로그 내용 좋음

http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110115454542

(여기는 Looper가 설명이 잘되어 있음)