RxAndroid2.0 倒计时简单封装

/**
 * 倒计时
 */
public abstract class ThreadCountDown {
    protected boolean end;
    protected Observable<Integer> countdown;
    protected Observer<Integer> observer;

    //开始倒计时
    public void start(final int timeMin) {
        end = false;
        countdown = RxUtil.countDown(timeMin);
        loadInit();
        observer = new Observer<Integer>() {
            public Disposable d;

            @Override
            public void onSubscribe(Disposable d) {
                this.d = d;
            }

            @Override
            public void onNext(Integer value) {
//                LogUtil.i("执行中---" + value);
                if (!end)
                    onProgress(value);
                else
                    d.dispose();
                //如果标记为结束 停止轮询
            }


            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onComplete() {
                if (end) return;//已经结束 不调用了
                ThreadCountDown.this.onComplete();
            }
        };
        countdown.subscribe(observer);
    }

    //倒计时完成,手动调用后 轮询将会停止
    public void onComplete() {
        this.end = true;
    }

    //是否完成
    protected boolean isComplete() {
        return end;
    }

    //倒计时进度 主线程
    public abstract void onProgress(Integer value);

    //倒计时初始化
    public abstract void loadInit();

}

public class RxUtil {

    public static Observable<Integer> countDown(final int time) {
        //延时0秒 轮询间隔1秒 轮询次数 time+1
        return Observable.interval(0, 1, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread(), false, 100)
                .map(new Function<Long, Integer>() {
                    @Override
                    public Integer apply(Long aLong) throws Exception {
                        return time - aLong.intValue();
                    }
                })
                .take(time + 1);

        //  .subscribeOn(AndroidSchedulers.mainThread())
//                .observeOn(AndroidSchedulers.mainThread())
    }
}


//使用

/**
 * 退出登录框
 */
public class ExitloginDialog extends ThreadCountDown {
    private static final ExitloginDialog exitLogin = new ExitloginDialog();
    private AlertDialog gloDialog;
    private String title;
    private String content;

    public static ExitloginDialog getInstance() {
        return exitLogin;
    }
    //开始倒计时 10秒后退出程序 或者手动退出
    public void show(String title) {
        if (isShow())
            return;
        this.title = title;
        this.content = title;
        super.start(10);
    }

    public boolean isShow() {
        if (gloDialog != null && gloDialog.isShowing()) return true;
        return false;
    }

    @Override
    public void onProgress(Integer value) {
    //主线程 倒计时结果 可以在这更新ui
    }

    @Override
    public void loadInit() {
        
        AlertDialog.Builder builder = new AlertDialog.Builder(BaseApplication.getApplication().getActivity());
        builder = builder.setMessage(content);
        builder.setTitle(title);
        builder.setPositiveButton("立即退出", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                onComplete();
            }
        });
        gloDialog = builder.create();
        //设置为全局,不依赖activity
        gloDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
        gloDialog.setCancelable(false);
        gloDialog.setCanceledOnTouchOutside(false);
        gloDialog.show();
    }

    @Override
    public void onComplete() {
        super.onComplete();
        system.exit(0);
        gloDialog = null;
    }
}
 ExitloginDialog instance = ExitloginDialog.getInstance();
 instance.show("退出登录");//开启倒计时



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值