android 異步處理
講點簡單的異步處理方法把,刷新頁面,延遲刷新數(shù)據(jù),定時任務有時候會用得到
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? ? 執(zhí)行代碼放這里 刷新頁面也行 執(zhí)行其他函數(shù)也可以
? ? }? ??
?},?delay);??
線程
new Thread(new Runnable(){??
? ?public void run(){??
? ? ? ? Thread.sleep(XXXX);??
? ? ? ? handler.sendMessage();----告訴主線程執(zhí)行任務??
? ? ? ? }??
? ? }).start();
延時器
?TimerTask task = new TimerTask(){? ??
? ? ?public void run(){? ? ?
? ? ?//execute the task? ? ?
? ? ?}? ??
};? ??
?Timer timer = new Timer();??
? timer.schedule(task, delay);??
這些方法不用導第三方包,直接復制用就好
-----------------分割線----------------------------------------
再推薦一個更好一點的方法,不過使用起來有點復雜?RXJAVA2
? ?
? ? 先要導包,注意新版舊版的函數(shù)代碼都會有更新,如果有沖突的話注意查看最新寫法
? ? 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'
// 示例 動態(tài)判斷權(quán)限代碼
? ? 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){
? ? ? ? ? ? ? ? ? ? //申請的權(quán)限全部允許
? ? ? ? ? ? ? ? ? ? Toast.makeText(B_Activity.this, "允許了權(quán)限!", Toast.LENGTH_SHORT).show();
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? //只要有一個權(quán)限被拒絕,就會執(zhí)行
? ? ? ? ? ? ? ? ? ? Toast.makeText(B_Activity.this, "未授權(quán)權(quán)限,部分功能不能使用", Toast.LENGTH_SHORT).show();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
-----------------------------我是分割線----------------------------------------
導包? ?? ? 這個是:rxjava:1的 兩者區(qū)分很大 留意了,最新的估計還有變化
? ? 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)? // 寫入權(quán)限 和拍照權(quán)限
? ? ? ? ? ? ? ? .subscribe(new Subscriber<Boolean>() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onCompleted() {
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onError(Throwable e) {
? ? ? ? ? ? ? ? ? ? ? ? Log.e("權(quán)限錯誤", "e:" + e);
//? ? ? ? ? ? ? ? ? ? ? ? ? ? Toast.makeText(mContext, "出現(xiàn)異常", Toast.LENGTH_SHORT).show();
? ? ? ? ? ? ? ? ? ? ? ? showToast("請把存儲權(quán)限打開");
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onNext(Boolean aBoolean) {
? ? ? ? ? ? ? ? ? ? ? ? if (!aBoolean) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? showToast("請把相機和存儲權(quán)限打開");
? ? ? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
-----------------------------我是分割線----------------------------------------
還有這種,定時處理,可以設置次數(shù) 間隔時間 什么時候啟動,記得添加這個就好? .observeOn(AndroidSchedulers.mainThread())?//切換線程 就這一個就夠了
? ? ? ? Observable.intervalRange(
? ? ? ? ? ? ? ? 0,//從1開始計數(shù)
? ? ? ? ? ? ? ? 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", "定時鏈接:執(zhí)行代碼放在這里" + aLong);
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
-----------------------------我是分割線----------------------------------------
還有這種? 定時任務,當然你可以在需要的時候把他停掉,可操作性大了一點
重新打開的話要重新執(zhí)行一次就是了,里面onError也有異常處理,可以統(tǒng)一
放在那里處理
?d1[0].dispose();//停止任務調(diào)用這個???停止循環(huán)任務
final Disposable[] d1 = new Disposable[1];
Observable.interval(0, 1, TimeUnit.SECONDS)// 這里參數(shù)可以調(diào)整,自己試著調(diào)就好
? ? ? ? ? ? ? ? .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是一個挺復雜的工具,這里就不講原理了,直接用把,要做深層次功能的時候
就無法避免去多研究了,主要還是相互之間的關系把