代码之家  ›  专栏  ›  技术社区  ›  mike-gallego

在RecyclerView切换音频源中处理MediaPlayer时遇到问题

  •  0
  • mike-gallego  · 技术社区  · 6 年前

    public void onBindViewHolder(@NonNull final TrackHolder holder, final int position) {
        holder.mInstrumentalName.setText(tracks.get(position).getInstrumentalName());
        holder.mProducer.setText(tracks.get(position).getProducer());
        final MediaPlayer mediaPlayer = new MediaPlayer();
    
        holder.mPlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                holder.mPlayButton.toggle();
    
                try {
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            if (mediaPlayer.isPlaying()) {
                                Log.d("is_playing", "is_playing");
                                mediaPlayer.stop();
                                try {
                                    mediaPlayer.setDataSource(tracks.get(position).getMusicLink());
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                mediaPlayer.start();
                            } else {
                                mediaPlayer.start();
    
                            }
    
                        }
                    });
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mediaPlayer) {
                            mediaPlayer.release();
                            Log.d("released", "released");
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(View v, int pos) {
                Toast.makeText(context, Integer.toString(tracks.size()), Toast.LENGTH_SHORT).show();
            }
        });
    }
    

    下图显示了项目列表,黄色表示正在播放音乐,黑色表示不播放: enter image description here

    1 回复  |  直到 6 年前
        1
  •  3
  •   Gabe Sechan    6 年前

    使用单个全局媒体播放器,而不是每个视图使用一个播放器。然后单击某个项目时,停止音频,设置新的数据源,然后重新启动。

    一般来说,使用多个媒体播放器是个坏主意,不管怎样,这些东西会占用大量内存。因此,你当前的代码非常糟糕。在每个绑定上创建一个新的绑定会浪费大量内存,并且会导致缓慢的滚动。