2014-07-17 109 views
0

我有一個循環全部按鈕和一個停止按鈕。當我還在頁面上時,兩個按鈕都可以正常工作。問題是,當我點擊循環所有按鈕時,它會按照它應有的播放一系列音頻文件,但當我離開頁面(即按下手機的後退按鈕)並返回到頁面時,音頻不會「不要停下來!我點擊了停止按鈕,但它什麼也沒做。阻止它的唯一方法是進入任務管理器並結束程序。在我看來,一旦我離開頁面,mp2的引用會丟失......有沒有人對如何解決這個問題有任何建議。任何幫助,將不勝感激。下面是代碼:如何銷燬活動?

     public class OneVoc extends ActionBarActivity { 

private ListView lv; 
private MediaPlayer mp; 
private MediaPlayer mp2; 
int[] myAudio = {R.raw.v_1100, R.raw.v_1101, R.raw.v_1102, R.raw.v_1103, R.raw.v_1104, R.raw.v_1105, 
     R.raw.v_1113, R.raw.v_1106, R.raw.v_1107, R.raw.v_1108, R.raw.v_1109, R.raw.v_1110, R.raw.v_1112, 
     R.raw.v_1114, R.raw.v_1115, R.raw.v_1116}; 
int mCompleted = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.one_voc); 

    Button btnLoop = (Button) findViewById(R.id.button1); 
    Button btnStop = (Button) findViewById(R.id.button2); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if (mp2 != null) { 

       if (mp2.isPlaying()) { 
        mp2.setOnCompletionListener(null); 
        mp2.stop(); 

       } 
       mp2.reset(); 
       mp2.release(); 
       mp2 = null; 
      } 


      } 
    }); 

    btnLoop.setOnClickListener(new OnClickListener() { 



     @Override 
     public void onClick(View arg0) { 

      mp2 = MediaPlayer.create(getBaseContext(), myAudio[0]); 
      mp2.setOnCompletionListener(new OnCompletionListener() 
      { 
       @Override 
       public void onCompletion(MediaPlayer mp2) 
       { 
        mCompleted++; 
        mp2.reset(); 
        if (mCompleted < myAudio.length) 
        { 
         try 
         { 
          AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]); 
          if (afd != null) 
          { 
           mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
           afd.close(); 
           mp2.prepare(); 
           mp2.start(); 
          } 
         } 
         catch (Exception ex) 
         { 
          ex.printStackTrace(); 
         } 

        } 
        else if (mCompleted == myAudio.length) 
        { 
         mCompleted =0; 
         try 
         { 
          AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]); 
          if (afd != null) 
          { 
           mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
           afd.close(); 
           mp2.prepare(); 
           mp2.start(); 
          } 
         } 
         catch (Exception ex) 
         { 
          ex.printStackTrace(); 
         } 
        } 
        else 
        { 
         mCompleted=0; 
         mp2.release(); 
         mp2 = null; 
        } 

       } 
      }); 


      mp2.start(); 

     } 

    }); 
+1

想盡了辦法'完成()' – mapodev

+0

覆蓋活動的onPause()(不要忘記調用super.onPause();) – EpicPandaForce

+0

在你的onDestroy()活性的方法,嘗試執行點擊btnStop (btnStop.performClick())。但請確保btnStop不引用null。 –

回答

0

嘗試重寫onbackpressed方法

@Override 
    public void onBackPressed() 
    { 
     // code here to stop and finish() 
     super.onBackPressed(); 
    } 
0

我認爲這是一個這是一個音頻緩衝的問題,內存中加載音頻緩衝,堅持以後,完成()可能無法幫助ü。 (), 當你按下一個android按鈕上的按鈕時,它簡單地調用finish()來獲得當前活動,而當你按下home按鈕時,它會調用onPause(), 你需要重載onBackPressed()方法,並且在行super.onbackPressed ); 讓你的代碼停止播放。 當你轉到TakMgr時,它只是將PID引用到你的應用程序進程並殺死進程。 這就像System.exit(0);或android.os.process.kill(getMyPid()); 這只是結束你不想要的應用程序。

0

你可以在onPause()中暫停你的mp並在onResume()中重新啓動它嗎?
也許你還想要存儲在savedInstance你在哪個點!

希望它有助於

0

當你回來按活動只停留在媒體播放器並釋放資源並完成activity.that的吧..!

@Override 
    public void onBackPressed() 
    { 
     btnStop.performClick(); 
     super.onBackPressed(); 
    } 
+0

我是java編碼的新手。我正在學習,因爲我去...你在哪裏把代碼放在我的代碼中? – user3623689

+0

只是把你的活動課 –

+0

在活動課上哪裏?我把它放在任何地方,我得到紅色的波浪線?請告訴我究竟在哪裏。我很困惑。 – user3623689