Прогресс-бар, пока готовится медиаплеер - PullRequest
5 голосов
/ 25 июня 2011

Я пытаюсь выяснить, как получить индикатор выполнения с надписью «Загрузка. Пожалуйста, подождите ...», пока мой медиаплеер готовит потоковый файл.Что происходит сейчас, так это то, что он отображается после того, как песня подготовлена.Как я могу это исправить?

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

РЕДАКТИРОВАТЬ: Это код, который я сейчас имею:

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

Ответы [ 5 ]

5 голосов
/ 10 января 2014

Если кто-то все еще сталкивается с этой проблемой, вот код ниже

      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);
3 голосов
/ 25 июня 2011

Проблема заключается в том, что вы ничего не делаете здесь асинхронно, и вы должны это делать. Вы должны использовать AsyncTask , чтобы выполнять свою работу.

Взгляните на «4 шага», как подробно здесь:

4 шага

Когда выполняется асинхронная задача, задача проходит 4 шага:

  1. onPreExecute (), вызывается в потоке пользовательского интерфейса сразу после выполнения задачи. Этот шаг обычно используется для настройки задачи, например, показывая индикатор выполнения в пользовательском интерфейсе.
  2. doInBackground (Params ...), вызывается в фоновом потоке сразу после завершения выполнения onPreExecute (). Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. Параметры асинхронной задачи передаются на этот шаг. Результат вычисления должен быть возвращен этим шагом и будет возвращен к последнему шагу. Этот шаг также может использовать publishProgress (Progress ...) для публикации одной или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на шаге onProgressUpdate (Progress ...).
  3. onProgressUpdate (Progress ...), вызывается в потоке пользовательского интерфейса после вызова publishProgress (Progress ...). Время выполнения не определено. Этот метод используется для отображения любой формы прогресса в пользовательском интерфейсе, пока выполняется фоновое вычисление. Например, его можно использовать для анимации индикатора выполнения или отображения журналов в текстовом поле.
  4. onPostExecute (Result), вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений. Результат фонового вычисления передается на этот шаг в качестве параметра.

EDIT:

Вы можете создать анонимный внутренний класс для выполнения ставок, что может быть аналогично тому, как вы создаете обработчик 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();
}

Не забудьте следить за вашими дженериками здесь!

1 голос
/ 25 июня 2011

Вот класс активности. Здесь я показываю только путь.

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

Вот медиа-класс.

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

        }
    }
}

А вот main.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 голосов
/ 06 марта 2019

Вот мое решение: Функция prepareAsync используется для подготовки аудио, и это неблокирующая операция (она не блокирует основной поток приложения).

Затем я использовал функцию обратного вызова setOnPreparedListener, чтобы получить уведомление, когда prepareAsync возвращается, и аудио готово

public void playAudio(String audioFile){


//init the progress dialog
  final ProgressDialog progressDialog = new ProgressDialog(SubjectActivity.this);

    try {

         progressDialog.setCancelable(false);
         progressDialog.setMessage(" Waiting to Prepare ...");
         progressDialog.show();

// pass the url file to the media player
        mediaplayer.setDataSource(audioFile);
        mediaplayer.prepareAsync();


    } 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();
    }
//the callback gets called when prepareAsync audio file become ready, 
    mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaplayer.start();
// cancel the dialog
            progressDialog.cancel();
        }
    });


}
0 голосов
/ 27 июня 2011

Когда вы говорите prepare о базовом объекте mediaplayer, внутренне это действительно делает некоторую подготовку, такую ​​как - установка экстрактора для файла, настройка аудиодекодера для декодирования закодированного аудиофайла и настройка аудиоотвода для воспроизведения необработанных аудиоданных, которые были декодированы из декодера Теперь все это займет время, оно не мгновенное.

Таким образом, в исходном коде вы проверяете, есть ли медиаплеер isPlaying, а затем отклоняете его, но проблема в том, что медиаплеер еще не воспроизводит звук, и, таким образом, ваше отклонение никогда не вызывается, поэтому оно всегда видно.

Что вам нужно сделать, это реализовать прослушиватель MediaPlayer.OnPreparedListener, и когда в вашем приложении вызывается метод onPrepared, вызовите dismiss mediaPlayerLoadingBar.dismiss(); в этом методе.

...