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가 설명이 잘되어 있음)
'■ Android > Tip' 카테고리의 다른 글
[Android] Background 처리(103) - 루퍼(Looper), 핸들러, 스레드로 메시지 전송하기 (실습 코드) (0) | 2020.03.21 |
---|---|
[Android] Background 처리(102) - Handler와 Looper의 필요성 (0) | 2020.03.20 |
[Android] Background 처리(100) - 핸들러(Handler) 함수들 (0) | 2020.03.19 |
[Android] Background 처리(100) - 핸들러(Handler) 설명, 사용법 (UI건드릴 수 있는거) (0) | 2020.03.19 |
[Android] 9-Patch-Resizer 사용법 - (이미지 해상도 관리) (0) | 2020.03.18 |