rxjava使用介绍(1)——进行计时操作

时间:2023-04-07 16:58:30

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();
        }
    }
}

运行结果如下: rxjava使用介绍(1)——进行计时操作 (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)——进行计时操作

问题总结

本文将初步介绍rxjava进行定时任务的两种方式,1)使用 timer 操作符(2)使用 interval 和 take 操作符,有兴趣的同学可以进一步深入研究。