關于Activity銷毀,而繪制UI的子線程未銷毀出現(xiàn)的問題項目總結 --------------------------------------------------------------------------------------------------------- 有一個功能模塊,需要播放音頻,畫一個簡單的界面 一個例子: 我們都知道播放音頻要用到MediaPlayer類,我這里,不需要開啟Service,就在本Activity播放音頻,當Activity銷毀的時候,音頻便結束 但是有一個重點,需要即時的變化當前播放的時間 我的思路是,開啟一個線程,計算當前音頻的剩余播放時間,如果>0 則用Handler循環(huán)發(fā)送一個消息來更改時間UI Thread tPlay ; tPlay = new Thread(new Runnable() { @Override public void run() { int time = (mPlay.getDuration()-mPlay.getCurrentPosition())/1000; // 獲得當前的音頻的剩余時間,總時長-當前播放時長 while(time>0&&mPlay!=null) { // 如果剩余時間>0 并且MediaPlayer對象存在,就需要沒0.2秒更新一下時間UI try { Thread.sleep(200); time = (mPlay.getDuration()-mPlay.getCurrentPosition())/1000; //獲得當前時間 final int finalTime = time; handler.post(new Runnable() { @Override public void run() { topic_play_time.setText(finalTime /60+"'"+ finalTime %60); //更改UI } }); } catch (InterruptedException e) { e.printStackTrace(); } } } });
然后有線程對象了,什么時候start呢,必然是在第一次播放音頻的時候,而且只能start一次。
那么問題來了。當我播放音頻的時候,或者暫停已經(jīng)播放一段的音頻的時候,用戶可能會退出Activity , 而Activity銷毀了,但是這個Activity開啟的計算時間更改UI的子線程還存在,它還需要循環(huán)計算剩余時間,但是MediaPlayer對象沒了,就報錯了。
所以,解決方法只能是銷毀Activity之前結束這個Activity開啟的子線程。 試過幾種方法,最后選定了一個最簡單,最易理解的方法: 即 1、設置一個全局標記變量boolean flag = true; 2、線程中while 循環(huán)判斷 flag 是否為true,是則執(zhí)行內部代碼,否則不執(zhí)行,結束循環(huán)了,即線程也隨之結束了 tPlay = new Thread(new Runnable() { @Override public void run() { int time = (mPlay.getDuration()-mPlay.getCurrentPosition())/1000; while(time>0&&mPlay!=null&&flag) { } } });
3、在Activity銷毀的 @Override protected void onDestroy() { super.onDestroy(); isflag=false; }
方法中更改flag,那么線程中while條件則不成立,線程就結束了,也不會再報錯了。
貼一下關鍵代碼: ![]()
分類: 安卓開發(fā)問題集
評論列表
|
|