Unable to play multiple audio files in Android using MediaPlayer objects

I have a great list. Each list view item has a play button (image). Pressing this play button will play a small audio file.

I created an adapter for loading items in a list and implemented an onClick listener during playback.

When I run the application, it loads the list correctly, but there are some problems with the audio. When I play several (for example, 10-12) elements many times (for example, 100), this will not create problems, everything will work smoothly.

But if I play more items like 30-40 items in the list. It stops loading audio files for subsequent items. For elements, it worked, and it will continue to work, as new elements do not work.

enter image description here

    public class WordListAdapter extends BaseAdapter{
    private ArrayList<Word> wordArrayList;
    private Activity activity;
    private static LayoutInflater inflater=null;
    MediaPlayer mp;

    public WordListAdapter(Activity activity, ArrayList<Word> wordArrayList) {
        this.activity = activity;
        this.wordArrayList = wordArrayList;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return wordArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, final View convertView, final ViewGroup parent) {
        View view = convertView;
        if(convertView == null) {
            view = inflater.inflate(R.layout.item_word, null);
        }

        TextView word1 = (TextView) view.findViewById(R.id.word1);
        TextView word2 = (TextView) view.findViewById(R.id.word2);
        ImageView imageWord = (ImageView) view.findViewById(R.id.imageWord);
        ImageView playWord = (ImageView) view.findViewById(R.id.playWord);

        word1.setText(wordArrayList.get(position).lang1);
        word2.setText(wordArrayList.get(position).lang2);

        if(wordArrayList.get(position).pic == 0) {
            imageWord.setVisibility(GONE);
        }
        else {
            imageWord.setImageResource(wordArrayList.get(position).pic);
        }

        playWord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp = MediaPlayer.create(activity, wordArrayList.get(position).audio);
                mp.start();
            }
        });

        return view;
    }
}

I think the problem is that I created too many Media Player objects.

How to fix it?

+4
source share
2 answers

Once I ran into a similar problem, what I did was to use the service to play the media file. I share what I did. Create a service like the following

public class PlayMusicService extends Service
        implements MediaPlayer.OnCompletionListener,  MediaPlayer.OnErrorListener {

    private int audioResource;
    public static MediaPlayer player;


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        audioResource = intent.getIntExtra("musicResource",0);
        player = MediaPlayer.create(this, audioResource);
        player.setLooping(false);
        player.setVolume(100, 100);
        player.setOnCompletionListener(this);
        player.setOnErrorListener(this);
        player.start();
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
    }

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


    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        this.onDestroy();
    }

    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        return false;
    }
}

Then call this service as follows

        playWord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent serviceIntent = new Intent(getActivity(),PlayMusicService.class);
               serviceIntent.putExtra("musicResource", wordArrayList.get(position).audio);
            }
        });

, . , , .

+1

MediaPlayer , , MediaPlayers. mp.release(). , ( , - ):

playWord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mp = MediaPlayer.create(activity, wordArrayList.get(position).audio);
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
               @Override
               public void onCompletion(MediaPlayer mediaPlayer) {
                   mediaPlayer.release();
               }
            });
            mp.start();
       }
});
+1

Source: https://habr.com/ru/post/1667497/


All Articles