栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

android轮询

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

android轮询

目录

轮询实现方案:

Timer

Handler

RxJava

1.Interval

2.repeatWhen


轮询实现方案:

方案一:  Timer + Thread

实现思路:使用timer定时执行TimerTask

缺点:如果有异步任务,下次任务开始执行时需要判断上次任务是否完成,从而导致任务间隔时间不可控。

方案二:  HandlerThread

实现思路:在HandleMessage方法中执行任务,任务结束后向MessageQueue中添加延时消息

优点:如果有异步任务,只需在异步任务执行完毕后再向MessageQueue中添加延时消息,任务间隔时间可控

方案三: RxJava

实现思路: interval or repeatWhen

优点:优雅,逻辑清晰,和retrofit结合

Timer
static class CommitTimer extends TimerTask {
    @Override
    public void run() {
        commitLock.lock();
        try {
            doSome(0);//网络请求
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            commitLock.unlock();
        }
    }
}
Timer timer = new Timer();
timer.schedule(new CommitTimer(), 10 * 1000, 5*60* 1000);//Teask,延时时间,轮询间隔

 Handler
    HandlerThread handlerThread = new HandlerThread("BackgroundService");
    handlerThread.start();
    handler = new Handler(handlerThread.getLooper()){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //模拟耗时任务
            try {
                doSome(0);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //向MessageQueue中添加延时消息,5s后重复执行以上任务
            handler.sendEmptyMessageDelayed(MSG_GET_COMPARE_RESULT,5000);
        }
    };
    return new GetCompareResultBinder();

RxJava

1.Interval
 mSubscrib = Observable.interval(0, POLINNG_INTERVAL_TIME, TimeUnit.SECONDS)
                .flatMap(i -> doSome(0))//映射为网络请求,达到轮询的目的
                .subscribe(this::showSome);//根据返回结果终止轮询
private void showSome(Data data) {
        if (data.idRight()) {
            mSubscrib.dispose();
        }
    }

Android RxJava应用:网络请求轮询(无条件) - 简书

轮询间隔时间固定,灵活性不高

2.repeatWhen
mSubscrib = doSome(0)
        .repeatWhen(objectObservable -> {
            Log.d(TAG, "repeatWhen");
            return objectObservable
                    .zipWith(Observable.range(1, 5), (o, integer) -> integer)
                    .flatMap((Function>) integer ->
                     Observable.timer((long) POLINNG_INTERVAL_TIME * integer,
                        TimeUnit.SECONDS)
            );
        })
        .takeUntil(result -> {
            //takeUntil 根据返回结果结束轮询,
            //不能用repeatWhen里返回error来结束轮询,
            //因为这样会导致最后一次返回的数据不会被执行,直接跳转到系统的error逻辑
            Log.d(TAG, "taleUntil");
            return result.isRight();
        })
        .subscribe(this::showSome);

Android RxJava应用:网络请求轮询(有条件) - 简书

可以灵活调整轮询时间 

补充:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755464.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号