RxJava2, RxAndroid2

[RxAndroid2] Timer, TimerTask, CountDownTimer -> RxAndroid 로 바꿔보기

알통몬_ 2018. 10. 10. 14:00
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


안드로이드에서 주기적으로 실행하는 동작을 구현할 때 일반적으로

Timer 클래스나 Handler 클래스를 사용합니다.

Timer

schedule()을 이용해서 지연시간을 설정하거나, 특정 시간에 특정 동작을

실행할 수도 있고, 고정된 시간을 설정해서 동작을 반복실행할 수도 있습니다.


Handler

postDelayed() 로 지연시간 설정이나 반복 실행 구현 가능


Timer 사용 예제

package park.sunggyun.thomas.rxandroidex;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.TextView;

import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;

import java.util.Timer;
import java.util.TimerTask;

public class TimerExActivity extends RxAppCompatActivity {

private static final int DELAY = 0;
private static final int PERIOD = 1000;
private Timer timer = new Timer();

private int count = 0;

TextView textView;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timerex);
textView = findViewById(R.id.textView);

startTimer();
}

public void startTimer() {
timer.schedule(new TimerTask() {
@Override
public void run() {
count++;
runOnUiThread(() -> {
textView.setText("실행한 횟수 : " + count);
if(count == 20) {
stopTimer();
finish();
}
});
}
}, DELAY, PERIOD);
}

public void stopTimer() {
timer.cancel();
}

}

1초마다 textView 를 갱신하는 예제입니다.

Timer 클래스를 사용할 때 

정확한 시간마다 반복할 경우

scheduleAtFixedRate(TimerTask task, long delay, long period)를 사용하면 되고,

얼추 일정시간마다 반복할 경우

schedule(TimerTask, long delay, long period) 를 사용하면 됩니다.



만약 실행횟수를 제한해야 할 경우에는

CountDownTimer 클래스를 사용합니다.

package park.sunggyun.thomas.rxandroidex;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.annotation.Nullable;
import android.widget.TextView;

import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;


public class TimerExActivity extends RxAppCompatActivity {

private static final int COUNT_TIME = 10 * 1000; //밀리초단위
private static final int INTERVAL = 1000;

CountDownTimer countDownTimer;

TextView textView;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timerex);
textView = findViewById(R.id.textView);
init();
}

private void init() {
countDownTimer = new CountDownTimer(COUNT_TIME, INTERVAL) {
@Override
public void onTick(long millisUntilFinished) {
textView.setText(String.valueOf(millisUntilFinished));
}

@Override
public void onFinish() {
finish();
}
};
countDownTimer.start();
}

}


Timer 예제를 RxAndroid를 적용해 바꾸기

package park.sunggyun.thomas.rxandroidex;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.TextView;

import com.trello.rxlifecycle2.components.support.RxAppCompatActivity;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;


public class TimerExActivity extends RxAppCompatActivity {


TextView textView;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timerex);
textView = findViewById(R.id.textView);
init();
}

private void init() {
Observable<String> src = Observable.interval(1, TimeUnit.SECONDS)
.flatMap(s -> Observable.just("RxAndroid Example #1 : " + s));

src.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(textView::setText);
}

/*private void init2() {
Observable<String> src2 = Observable.just("RxAndroid Example #1 :")
.repeatWhen(s -> s.delay(1, TimeUnit.SECONDS));

src2.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(textView::setText);
}*/

}

init() 과 init2()를 번갈아 주석을 풀어가며 예제를 실행해보시면 되겠습니다.


이상입니다.

다음 포스팅에서는  RxAndroid를 활용한 네트워크 프로그래밍에 대해 공부합니다.

반응형