前言
最近在使用Handler的時候 發現了一個錯誤的使用方法
就是直接new 類似這樣
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
showPaySuccessDialog.dismiss();
}
}, 1000);
這種用法對于業務簡單的情況 也沒錯 比如 定時關閉一個dialog
但是對于復雜的業務場景 這么用是不對的 也不是不對吧 這么用的話有bug
遇到的問題
我用 直接new Handler()的方法去執行一個播放語音的方法
代碼如下
//todo 此處檢測
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (!MediaplayerUtil.isPlaying()) {
MediaplayerUtil.playMusic(context, R.raw.pay_tips);
}
}
}, 15 * 1000);
我以為這樣寫沒錯 但是在測驗的時候 出現了一個問題
頁面都關閉了 這個語音播報 還在繼續 哈哈哈 我同事聽到都驚呆了
頁面都沒有了 語音還在播放 很尷尬
當時聽到這個語音 我一耳就聽出了問題
因為當時這么寫 就覺得不對勁 可能會出問題 所以我加了一個TODO標記
提示這里可能會出問題
解決方法
歸根結底 還是我的寫法問題 不夠正規 偷懶行為 哈哈哈
- 1、首先創建一個Handler物件
Handler handler=new Handler();
- 2、然后創建一個Runnable物件
Runnable runnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情,這里再次呼叫此Runnable物件,以實作每兩秒實作一次的定時器操作
handler.postDelayed(this, 2000);
}
};
- 3、使用PostDelayed方法,兩秒后呼叫此Runnable物件
- 實際上也就實作了一個2s的一個定時器
handler.postDelayed(runnable, 2000);
- 4、如果想要關閉此定時器,可以這樣操作
handler.removeCallbacks(runnable);
Handler 定時器 正確使用方法
//初始化先
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
// 這個是回圈 間隔3s彈一次Toast
handler.postDelayed(this, 3 *1000);
Toast.makeText(this, "延時5s", Toast.LENGTH_SHORT).show();
}
};
// 延遲2s彈Toasat
handler.postDelayed(runnable,2000);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在頁面結束時 清空佇列訊息
if (handler != null) {
handler.removeCallbacksAndMessages(null);
handler = null;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/278110.html
標籤:其他
上一篇:屬性影片 ValueAnimator.ofInt運行原理
下一篇:洛谷-失蹤的7
