2011-06-25 33 views
5

我想知道如何在我的媒體播放器準備流媒體文件時擁有「加載。請稍候...」的進度條。現在發生的是它在歌曲準備好後顯示。我怎樣才能解決這個問題?媒體播放器正在準備進度條

 mediaPlayerLoadingBar =ProgressDialog.show(PlaylistActivity.this, "", "Loading. Please wait...", true);   
        /*dubstep stream*/ 
        try { 
         dubstepMediaPlayer.setDataSource(dubstepPlaylistString[0]); 
         dubstepMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
         dubstepMediaPlayer.prepare(); 

        } catch (IllegalArgumentException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (SecurityException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IllegalStateException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 


        dubstepMediaPlayer.start(); 
        if(dubstepMediaPlayer.isPlaying()){ 
         mediaPlayerLoadingBar.dismiss(); 
        }` 

編輯: 這是代碼我現在有:

    new AsyncTask<Void, Void, Void>(){ 

        @Override 
        protected void onPreExecute(){ 
         mediaPlayerLoadingBar =ProgressDialog.show(PlaylistActivity.this, "", "Loading. Please wait...", true); 
         try { 
          dubstepMediaPlayer.setDataSource(dubstepPlaylistString[0]); 
         } catch (IllegalArgumentException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IllegalStateException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         dubstepMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
        } 

        @Override 
        protected Void doInBackground(Void... params) { 
         // TODO Auto-generated method stub 
         //mediaPlayerLoadingBar =ProgressDialog.show(PlaylistActivity.this, "", "Loading. Please wait...", true); 
         return null; 
        } 

        protected void onPostExecute(Void result){ 
         //mediaPlayerLoadingBar =ProgressDialog.show(PlaylistActivity.this, "", "Loading. Please wait...", true) 
          dubstepMediaPlayer.prepareAsync(); 
         dubstepMediaPlayer.start(); 
         mediaPlayerLoadingBar.dismiss(); 

       } 

       }.execute();` 

回答

3

的問題在於,你沒有做任何事情異步:

`開關(pSelection){ 情況1在這裏,你應該是。你應該使用AsyncTask來完成你的工作。

看一看 '4個步驟',因爲這裏詳細:

當執行異步任務4個步驟

,任務經過4個步驟:

  1. onPreExecute ()在任務執行後立即在UI線程上調用。此步驟通常用於設置任務,例如通過在用戶界面中顯示進度條。
  2. doInBackground(Params ...),在onPreExecute()完成執行後立即在後臺線程上調用。此步驟用於執行可能需要很長時間的後臺計算。異步任務的參數傳遞給此步驟。計算結果必須通過該步驟返回並返回到最後一步。此步驟還可以使用publishProgress(Progress ...)發佈一個或多個進度單元。這些值在onProgressUpdate(Progress ...)步驟中發佈在UI線程上。
  3. onProgressUpdate(Progress ...),在調用publishProgress(Progress ...)後在UI線程上調用。執行的時間是未定義的。此方法用於在後臺計算仍在執行時在用戶界面中顯示任何形式的進度。例如,它可以用來爲進度條設置動畫效果或在文本字段中顯示日誌。
  4. onPostExecute(Result),在後臺計算完成後在UI線程上調用。後臺計算的結果作爲參數傳遞給此步驟。

編輯:

您可以創建一個匿名內部類聽從你的命令,這可能是類似你是如何創建的onClick處理程序。在你的onClick做這樣的事情:

//pseudo-code... 
onClick(View v, ...) { 
    new AsyncTask<Generic1, Generic2, Generic3>() { 
     protected void onPreExecute() { 
      // do pre execute stuff... 
     } 

     protected Generic3 doInBackground(Generic1... params) { 
      // do background stuff... 
     } 

     protected void onPostExecute(Generic3 result) { 
      // do post execute stuff... 
     } 
    }.execute(); 
} 

不要忘了在這裏留意你的仿製藥!

+0

行代碼中,我似乎明白了,或者至少我覺得我做的,你說的話。那麼我應該在哪裏創建這個類。因爲這個代碼在'onCLick'裏面。是否擴展'AsyncTask'或我的主類? – Splitusa

+0

我已經更新了一些更多的指導我的答案... –

+0

所以在我點擊只是寫'MediaPlayerAsync onPreExecute'等? – Splitusa

1

這裏是活動班。在這裏我只是展示了一種方式。

package com.android.mediaactivity; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.LinearLayout; 
import android.widget.ProgressBar; 

    public class MediaActivity extends Activity 
    { 
     public LinearLayout mainLayout; 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      mainLayout=(LinearLayout)findViewById(R.id.mainlinear); 
      MediaPlayer media=new MediaPlayer(this); 
      media.startPlayer(); 
     } 
    } 

這裏是mediaplayerclass。

package com.android.mediaactivity; 

import java.io.IOException; 

import android.media.MediaPlayer.OnPreparedListener; 

public class MediaPlayer implements OnPreparedListener { 
    MediaActivity mediaActivity; 
    android.media.MediaPlayer mediaPlayer; 
    public MediaPlayer(MediaActivity mediaActivity) { 
     this.mediaActivity = mediaActivity; 
    } 
    public void startPlayer() { 
     mediaPlayer = new android.media.MediaPlayer(); 
     mediaPlayer.setOnPreparedListener(this); 
     mediaPlayer.reset(); 
     try { 
      mediaPlayer.setDataSource(""); 
      mediaPlayer.prepareAsync(); 
      toggleProgress(true); 
     } catch (IllegalArgumentException e) { // TODO Auto-generated catch block   e.printStackTrace();  } catch (IllegalStateException e) {    // TODO Auto-generated catch block   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } public void onPrepared(android.media.MediaPlayer mp) {  toggleProgress(false);  mediaPlayer.start(); } 
      public void toggleProgress(final boolean show) { 
       mediaActivity.runOnUiThread(new Runnable() { 
        public void run() { 
         if (show) mediaActivity.mainLayout.setVisibility(mediaActivity.mainLayout.VISIBLE); 
         else mediaActivity.mainLayout.setVisibility(mediaActivity.mainLayout.INVISIBLE); 
        } 
       }); 
      } 

     } 
    } 
} 

這裏是主要的。XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:id="@+id/mainlinear" 
    android:visibility="invisible"> 

    <ProgressBar android:id="@+id/ProgressBar01" 
     android:layout_width="wrap_content" android:layout_height="wrap_content"></ProgressBar> 
</LinearLayout> 
+0

我試過這個,它沒有工作 – Splitusa

+0

我試過這種方式,它的工作原理。 – Hitendra

+0

好的。我會再試一次,並讓你知道 – Splitusa

0

當你說prepare底層mediaplayer對象上,在內部它確實像一些準備 - 設置該文件的提取,設置音頻解碼器解碼編碼後的音頻文件,並設置了音頻接收播放從解碼器解碼的原始音頻數據。現在這一切都需要時間,這不是瞬間的。

因此,在您的原始代碼中,您檢查mediaplayer isPlaying然後解散它,但問題是在那個時間mediaplayer不播放音頻,因此您的解僱永遠不會被調用,因此它總是可見的。

您需要做的是實現監聽器MediaPlayer.OnPreparedListener,並且在應用程序中調用方法onPrepared時,請在該方法中調用解除mediaPlayerLoadingBar.dismiss();

5

如果有人還在這裏面臨這樣的問題是低於

 AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected void onPreExecute() { 
       if(translation.equals("NIV")) 
       { 
        if(AudioPlaying==false) 
        { 
         mediaPlayer = new MediaPlayer(); 
         mediaPlayer.setOnPreparedListener(Main.this); 
         mediaController = new MediaController(Main.this); 
        } 
        else 
         mediaController.show(); 
       } 
       else 
        Toast.makeText(getBaseContext(), "عفوا, جاري تحميل ملفات الصوت الخاصة بترجمة الفانديك ", Toast.LENGTH_LONG).show(); 
       pd = new ProgressDialog(Main.this); 
       pd.setTitle("Processing..."); 
       pd.setMessage("Please wait."); 
       pd.setCancelable(false); 
       pd.setIndeterminate(true); 
       pd.show(); 

      } 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       try { 
        //Do something... 
        //Thread.sleep(5000); 
        try 
        { 
         mediaPlayer.setDataSource(AudioUrlPath); 
         mediaPlayer.prepare(); 
         mediaPlayer.start(); 
         AudioPlaying=true; 
        } 
        catch (IOException e) { 
         Log.e("AudioFileError", "Could not open file " + AudioUrlPath + " for playback.", e); 
        } 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       if (pd!=null) { 
        pd.dismiss(); 
        //b.setEnabled(true); 
       } 
      } 

     }; 
     task.execute((Void[])null); 
+0

你讓我贏得了尊重兄弟(對於我自由職業任務):p – Jigar