rxjava使用介绍(1)——进行计时操作
问题背景
安卓日常开发和学习过程中,rxjava是一个十分常见的组件,经常会用来进行一个异步的操作和定时任务的执行,本文将初步介绍rxjava进行定时任务。
问题分析
rxjava进行定时任务可以通过两种方式来实现。(1)使用 timer 操作符(2)使用 interval 和 take 操作符。 下面将分别对这两种方法进行介绍
问题解决
(1)rxjava使用 timer 操作符实现定时操作。代码如下:
package com.baorant.resolverapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.baorant.resolverapplication.view.SmallGridView;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* @author baorant
*/
public class TestViewActivity extends AppCompatActivity {
private Disposable mDisposable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_view);
......
// 进行计时
countTimeByTimer();
}
/**
* 通过timer实现10秒的一个定时操作
*/
private void countTimeByTimer() {
Observable.timer(10, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
long begin = System.currentTimeMillis();
Log.d("baorant", String.valueOf(begin));
}
@Override
public void onNext(Long value) {
//Log.d("Timer",""+value);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
long end = System.currentTimeMillis();
Log.d("baorant", String.valueOf(end));
closeTimer();
}
});
}
/**
* 关闭定时器
*/
public void closeTimer(){
if (mDisposable != null) {
mDisposable.dispose();
}
}
}
运行结果如下: (2)rxjava使用 interval 和 take 操作符来实现定时操作 代码如下:
package com.baorant.resolverapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.baorant.resolverapplication.view.SmallGridView;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
/**
* @author baorant
*/
public class TestViewActivity extends AppCompatActivity {
private Disposable mDisposable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_view);
......
// 进行计时
countTimeByInterval();
}
/**
* 通过Interval实现10秒的一个定时操作
*/
public void countTimeByInterval() {
// 总时间
int countTime = 10;
Observable.interval(0, 1, TimeUnit.SECONDS)
// 设置总共发送的次数
.take(countTime + 1)
.map(new Function<Long, Long>() {
@Override
public Long apply(Long aLong) throws Exception {
// aLong从0开始
return countTime - aLong;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
long begin = System.currentTimeMillis();
Log.d("baorant", String.valueOf(begin));
}
@Override
public void onNext(Long value) {
//Log.d("Timer",""+value);
}
@Override
public void onError(Throwable e) {
long end = System.currentTimeMillis();
Log.d("baorant", String.valueOf(end));
}
@Override
public void onComplete() {
long end = System.currentTimeMillis();
Log.d("baorant", String.valueOf(end));
closeTimer();
}
});
}
/**
* 关闭定时器
*/
public void closeTimer(){
if (mDisposable != null) {
mDisposable.dispose();
}
}
}
运行结果如下:
问题总结
本文将初步介绍rxjava进行定时任务的两种方式,1)使用 timer 操作符(2)使用 interval 和 take 操作符,有兴趣的同学可以进一步深入研究。