1

Я новичок в разработке Android и начинаю с простого приложения звуковой платы. Я начал разрабатывать звуковую плату с использованием нескольких фрагментов, пока не понял, что я использую несколько экземпляров MediaPlayer. Это не очень хорошо, потому что я хочу только один звук играть одновременно.Как использовать MediaPlayer Singleton

Я понял, что мне придется использовать MediaPlayer Singleton для решения моей проблемы. Единственная проблема заключается в том, что я не могу найти много источников или примеров MediaPlayer Singleton онлайн.

Вот что я изначально поставил в каждую «onCreateView» в каждом фрагменте:

public static class FragmentPage1 extends Fragment { 

    int selectedSoundId; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_page1, container, false); 


     final MediaPlayer player = new MediaPlayer(); 
     final Resources res = getResources(); 

     final int[] buttonIds = { R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9 }; 
     final int[] soundIds = { R.raw.sound01, R.raw.sound02, R.raw.sound03, R.raw.sound04, R.raw.sound05, R.raw.sound06, R.raw.sound07, R.raw.sound08, R.raw.sound09 }; 

     View.OnClickListener listener = new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       for (int i = 0; i < buttonIds.length; i++) { 
        if (v.getId() == buttonIds[i]) { 
         selectedSoundId = soundIds[i]; 
         AssetFileDescriptor afd = res.openRawResourceFd(soundIds[i]); 
         player.reset(); 
         try { 
          player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
         } catch (IllegalArgumentException e) { 
          e.printStackTrace(); 
         } catch (IllegalStateException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         try { 
          player.prepare(); 
         } catch (IllegalStateException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
         player.start(); 
         break; 
        } 
       } 
      } 
     }; 

     for (int i = 0; i < buttonIds.length; i++) { 
      ImageButton soundButton = (ImageButton) rootView.findViewById(buttonIds[i]); 
      registerForContextMenu(soundButton); 
      soundButton.setOnClickListener(listener); 
     } 
     return rootView; 
    } 
} 

Насколько мне известно, я бы, вероятно, поставить onClickListener внутри каждого фрагмента и MediaPlayer Singleton в новом классе Java. Я не знаю, что делать дальше.

Как реализовать MediaPlayer Singleton и как его вызвать в методе «onCreateView»?

Примеры высоко оценены и спасибо!

ответ

2

См., Singleton - это шаблон проектирования, и он реализуется путем установки конструктора по умолчанию как частного, тогда вы должны предоставить метод get, из которого вы можете восстановить экземпляр объекта. Проверьте пример ниже:

public class Foo { 
    private MediaPlaye md; 

    private Foo() { 
     md = new MediaPlayer(); 
    } 

    public MediaPlayer getMediaPlayer() { 
     if (md == null) { 
      new Foo(); 
     } 
     return md; 
    } 
} 

В вашем sittuation, самое лучшее, что нужно сделать, это создать класс обслуживания, который будет инкапсулировать все методы MediaPlayer. Это делается так, потому что, как правило, разработчик хочет, чтобы игрок продолжал играть, даже если пользователь покидает действие, к которому он привязан. В каждом фрагменте, который вы хотите использовать API MediaPlayer, вы можете привязать службу и использовать определенный интерфейс. Посмотрите на следующий класс:

public class MusicPlayerService extends android.app.Service implements MediaPlayer.OnPreparedListener, 
     MediaPlayer.OnErrorListener, 
     MediaPlayer.OnCompletionListener, 
     ObserverSubject { 

    private static final int NOTIFY_ID = 1; 
    private List<MusicPlayerObserver> mObservers; 

    private MediaPlayer mMediaPlayer; 
    private final IBinder playerBind = new MusicBinder();; 

    private List<Track> mPlaylist; 
    private Integer mPosition; 

    private Boolean isRepeating; 
    private Boolean isShuffling; 
    private Boolean isPrepared; 
    private Boolean isPaused; 

    // Callback Methods______________________________________________ 
    @Override 
    public void onCreate() { 
     ... 
    } 

    @Override 
    public void onPrepared(MediaPlayer mp) { 
     ... 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return playerBind; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     mMediaPlayer.stop(); 
     mMediaPlayer.release(); 
     return false; 
    } 

    @Override 
    public void onDestroy() { 
     stopForeground(true); 
    } 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     mp.reset(); 
     return false; 
    } 


    // UTIL METHODS__________________________________________________ 
    private Long getCurrentTrackId() { 
     return mPlaylist.get(mPosition).getTrackId(); 
    } 

    private Long getCurrentAlbumId() { 
     return mPlaylist.get(mPosition).getAlbumId(); 
    } 



    // MEDIA PLAYER INTERFACE________________________________________ 

    public void play() { 
     ... 
    } 

    public void pause() { 
     ... 
    } 

    public void resume() { 
     ... 
    } 

    public void next() { 
     ... 
    } 

    public void previous() { 
     ... 
    } 

    public void seekTo(int pos) { 
     ... 
    } 

    // SERVICE INTERFACE PROVIDER_____________________________________ 
    /** 
    * Interface through the component bound to this service can interact with it 
    */ 
    public class MusicBinder extends Binder { 
     public MusicPlayerService getService() { 
      return MusicPlayerService.this; 
     } 
    } 
} 

Я настоятельно рекомендую вам следовать этой стратегии создания службы MusicPlayer. Кроме того, я предлагаю вам заглянуть в другой проект Patter, называемый Observer. Обычно в музыкальных приложениях вы хотите обновить несколько элементов пользовательского интерфейса на основе состояния MP. Наблюдатель идеально подходит для этой ситуации.

Надеюсь, я немного помог.

Смежные вопросы