RxAndroid2.0 倒计时简单封装

来源:互联网 发布:mac iphone照片导出 编辑:程序博客网 时间:2024/06/05 04:35
/** * 倒计时 */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("退出登录");//开启倒计时



原创粉丝点击