2011-06-25 14 views
5

Próbuję dowiedzieć się, jak wyświetlić pasek postępu z komunikatem "Ładowanie. Proszę czekać ...", podczas gdy mój odtwarzacz multimedialny przygotowuje plik przesyłania strumieniowego. Teraz pojawia się informacja, że ​​utwór jest gotowy. jak mogę to naprawić?Pasek postępu podczas przygotowywania odtwarzacza multimedialnego

 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(); 
        }` 

EDIT: Jest to kod mam teraz:

`przełącznik (pSelection) { case 1:

    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();` 

Odpowiedz

3

Problem polega na tym, że nie robisz nic asynchronicznie tutaj i powinieneś być. Do wykonania swojej pracy powinieneś użyć AsyncTask.

Spójrz na '4 kroki', jak opisano tutaj:

4 kroki

Kiedy asynchroniczne zadanie jest wykonywane zadanie przechodzi 4 etapów:

  1. onPreExecute(), wywoływane w wątku UI natychmiast po wykonaniu zadania. Ten krok jest zwykle używany do konfigurowania zadania, na przykład poprzez wyświetlanie paska postępu w interfejsie użytkownika.
  2. doInBackground (Params ...), wywoływany na wątku w tle zaraz po zakończeniu operacji onPreExecute(). Ten krok służy do wykonywania obliczeń w tle, które mogą zająć dużo czasu. Parametry asynchronicznego zadania są przekazywane do tego kroku. Wynik obliczenia musi zostać zwrócony przez ten krok i zostanie zwrócony do ostatniego kroku. W tym kroku można również użyć publishProgress (Progress ...), aby opublikować jedną lub więcej jednostek postępu. Wartości te są publikowane w wątku UI w kroku onProgressUpdate (Postęp ...).
  3. onProgressUpdate (Postęp ...), wywoływany w wątku interfejsu użytkownika po wywołaniu funkcji publishProgress (Postęp ...). Czas wykonania jest nieokreślony. Ta metoda służy do wyświetlania dowolnej postaci postępu w interfejsie użytkownika podczas wykonywania obliczeń w tle. Na przykład może być użyty do animowania paska postępu lub wyświetlania logów w polu tekstowym.
  4. onPostExecute (Wynik), wywoływany w wątku interfejsu użytkownika po zakończeniu obliczania w tle. Wynik obliczeń w tle jest przekazywany do tego kroku jako parametr.

EDIT:

Można utworzyć anonimową klasę wewnętrzną, aby zrobić swoje rozkazy, które mogą być podobne do tego, jak tworzysz swoją obsługi onClick. W swoim systemie onClick wykonaj coś takiego:

//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(); 
} 

Nie zapomnij tutaj obserwować swoich leków generycznych!

+0

ok wydaje mi się zrozumieć, a przynajmniej myślę, że robię to, co mówisz. Więc gdzie powinienem stworzyć tę klasę? Ponieważ ten kod znajduje się wewnątrz 'onKliknij". czy to rozszerza 'AsyncTask' lub moją główną klasę? – Splitusa

+0

Mam zaktualizowaną moją odpowiedź z kilkoma dodatkowymi wskazówkami ... –

+0

więc wewnątrz mojego kliknięcia wystarczy napisać 'MediaPlayerAsync onPreExecute' itd.? – Splitusa

1

Oto klasa aktywności.Tutaj pokazuję tylko drogę.

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(); 
     } 
    } 

Oto klasa mediaplayer.

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); 
        } 
       }); 
      } 

     } 
    } 
} 

I tu jest główny.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

próbowałem tego i nie działało – Splitusa

+0

próbowałem w ten sposób i to działa. – Hitendra

+0

Ok. Spróbuję jeszcze raz i dam ci znać, – Splitusa

0

Kiedy mówisz prepare na leżącej mediaplayer obiektu, wewnętrznie to naprawdę robi pewne przygotowania jak - utworzenie ekstraktor dla pliku, konfigurowania dekoder audio do dekodowania zakodowanego pliku audio i konfigurowania audio sink, aby odtworzyć surowe dane audio, które zostały zdekodowane z dekodera. Teraz wszystko to wymaga czasu, nie jest natychmiastowe.

W oryginalnym kodzie sprawdzasz, czy mediaplayer isPlaying, a następnie go odrzucisz, ale problem jest w tym momencie, że mediaplayer nie odtwarza jeszcze dźwięku, a zatem twoje odwołanie nigdy nie jest wywoływane, więc zawsze jest widoczne.

Należy zaimplementować odbiornik MediaPlayer.OnPreparedListener, a po wywołaniu metody onPrepared w swojej aplikacji wywołać w tej metodzie odwołanie mediaPlayerLoadingBar.dismiss();.

5

Jeśli ktoś nadal stoi ten problem tutaj jest kod poniżej

 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

Zrobiłeś mi zarabiać szacunek Bracie (Dla mnie zadanie Freelancing): p – Jigar