欢迎光临散文网 会员登陆 & 注册

android 异步处理

2023-06-13 21:15 作者:翼618  | 我要投稿

讲点简单的异步处理方法把,刷新页面,延迟刷新数据,定时任务有时候会用得到


android消息处理  最后面的delay 替换成毫秒值  (延时器)

new Handler().postDelayed(new Runnable(){    

    public void run() {    

    //execute the task    

    }    

 }, delay);   


推荐使用这个 delay 直接改成毫米就好 不用东一块西一块

new Handler().postDelayed(new Runnable(){    

    public void run() {    

    //execute the task    执行代码放这里 刷新页面也行 执行其他函数也可以

    }    

 }, delay);  



线程

new Thread(new Runnable(){  

   public void run(){  

        Thread.sleep(XXXX);  

        handler.sendMessage();----告诉主线程执行任务  

        }  

    }).start();


延时器

 TimerTask task = new TimerTask(){    

     public void run(){     

     //execute the task     

     }    

};    


 Timer timer = new Timer();  

  timer.schedule(task, delay);  


这些方法不用导第三方包,直接复制用就好

-----------------分割线----------------------------------------

再推荐一个更好一点的方法,不过使用起来有点复杂 RXJAVA2

   

    先要导包,注意新版旧版的函数代码都会有更新,如果有冲突的话注意查看最新写法

    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'

    implementation 'io.reactivex.rxjava2:rxjava:2.0.7'

    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'


// 示例 动态判断权限代码

    RxPermissions rxPermissions=new RxPermissions(this);

        rxPermissions.request(

            anifest.permission.READ_EXTERNAL_STORAGE,

            Manifest.permission.CALL_PHONE,Manifest.permission.INTERNET)

        .subscribe(new Consumer<Boolean>() {

            @Override

            public void accept(Boolean aBoolean) throws Exception {

                if (aBoolean){

                    //申请的权限全部允许

                    Toast.makeText(B_Activity.this, "允许了权限!", Toast.LENGTH_SHORT).show();

                }else{

                    //只要有一个权限被拒绝,就会执行

                    Toast.makeText(B_Activity.this, "未授权权限,部分功能不能使用", Toast.LENGTH_SHORT).show();

                }

            }

        });


-----------------------------我是分割线----------------------------------------

导包       这个是:rxjava:1的 两者区分很大 留意了,最新的估计还有变化

    compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'

    compile 'io.reactivex:rxjava:1.1.+'

    compile 'io.reactivex:rxandroid:1.1.+'

    

RxPermissions.getInstance(this)

                .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)  // 写入权限 和拍照权限

                .subscribe(new Subscriber<Boolean>() {

                    @Override

                    public void onCompleted() {

                    }


                    @Override

                    public void onError(Throwable e) {

                        Log.e("权限错误", "e:" + e);

//                            Toast.makeText(mContext, "出现异常", Toast.LENGTH_SHORT).show();

                        showToast("请把存储权限打开");

                    }


                    @Override

                    public void onNext(Boolean aBoolean) {

                        if (!aBoolean) {

                            showToast("请把相机和存储权限打开");

                            return;

                        }

                    

                    }


                });

-----------------------------我是分割线----------------------------------------

还有这种,定时处理,可以设置次数 间隔时间 什么时候启动,记得添加这个就好  .observeOn(AndroidSchedulers.mainThread()) //切换线程 就这一个就够了

        Observable.intervalRange(

                0,//从1开始计数

                3,//计时5次

                0, //延时几秒开始

                5, //每次间隔1

                TimeUnit.SECONDS)//单位秒

                .observeOn(AndroidSchedulers.mainThread()) //切换线程 就这一个就够了

                .subscribe(new Consumer<Long>() {

                    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)

                    @Override

                    public void accept(Long aLong) throws Exception {

                        Log.e("Link", "定时链接:执行代码放在这里" + aLong);

                       

                        }


                    }

                });



-----------------------------我是分割线----------------------------------------

还有这种  定时任务,当然你可以在需要的时候把他停掉,可操作性大了一点

重新打开的话要重新执行一次就是了,里面onError也有异常处理,可以统一

放在那里处理


 d1[0].dispose();//停止任务调用这个   停止循环任务



final Disposable[] d1 = new Disposable[1];


Observable.interval(0, 1, TimeUnit.SECONDS)// 这里参数可以调整,自己试着调就好

                .subscribeOn(Schedulers.io())

                .observeOn(AndroidSchedulers.mainThread())

                .subscribe(new Observer<Long>() {

                    @Override

                    public void onNext(Long aLong) {

                        Log.e("LoginActivity", "aLong:" + aLong + mac);

                    }


                    @Override

                    public void onSubscribe(Disposable d) {

                        d1[0] = d;

                    }


                    @Override

                    public void onError(Throwable e) {

                    }

                    @Override

                    public void onComplete() {


                    }

                });


-----------------------------我是分割线----------------------------------------


RXJAVA是一个挺复杂的工具,这里就不讲原理了,直接用把,要做深层次功能的时候

就无法避免去多研究了,主要还是相互之间的关系把


android 异步处理的评论 (共 条)

分享到微博请遵守国家法律