小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

關于Activity銷毀,而繪制UI的子線程未銷毀出現(xiàn)的問題

 quasiceo 2016-07-25

關于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í)行內(nèi)部代碼,否則不執(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條件則不成立,線程就結束了,也不會再報錯了。

 

貼一下關鍵代碼:

關鍵代碼

 

posted @ 2015-11-12 20:42 聽著music睡 閱讀(499) 評論(10) 編輯 收藏
評論列表
  
#1樓 2015-11-12 21:04 KillU  
為什么進程都推出了 線成還在?
  
#2樓[樓主] 2015-11-12 21:34 聽著music睡  
@ KillU
實際上線程還是存在的,可以做個測試,開啟一個子線程 while 死循環(huán) 來設置一個TextView 文本信息,看看退出進程后,是不是會報錯
  
#3樓 2015-11-12 22:10 奔跑的蝸牛丶  
播放視屏之前 VideoView是不是黑的?樓主有碰到這種情況嗎?
  
#4樓[樓主] 2015-11-12 22:12 聽著music睡  
@ 奔跑的蝸牛丶
是播放界面出來之前黑的閃一下,還是黑到播放界面出來,還是你視頻播放自動到轉(zhuǎn)橫屏并閃黑一下
  
#5樓 2015-11-12 22:13 奔跑的蝸牛丶  
@ 聽著music睡
播放界面出來之后,沒有播放視頻一直是黑的。
  
#6樓[樓主] 2015-11-13 08:38 聽著music睡  
@ 奔跑的蝸牛丶
那就是代碼出問題了,看下VideoView使用步驟,一般沒有這種情況的。
  
#7樓 2015-11-17 16:28 掌握當下  
沒必要開線程。。。
  
#8樓[樓主] 2015-11-17 21:18 聽著music睡  
@ 掌握當下
請教下不開線程的情況下該怎么處理,我的思維這個情況一般要開線程。。。
  
#9樓 2015-11-18 14:33 掌握當下  
更新UI本質(zhì)上不在子線程上操作,UI操作必須在UI主線程中進行~可以用handler或者postdelay。。。方法很多~你的子線程中的post方法不就是為了把UI更新放到主線程中操作嗎~
  
#10樓[樓主] 2015-11-18 19:01 聽著music睡  
@ 掌握當下
說的對,忽視這點了

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多