我应该发布还是重置MediaPlayer?

5
我有一个自定义适配器类WordAdapter,并使用名为pronounce(WordAdapter类中的全局变量)的媒体播放器。 我有不同的活动,每个列表项都有一个线性布局(linearLayout)。我在其上设置onClickListener,以便在单击线性布局时播放声音文件。在播放完成后,我想释放任何不需要的内存。但我不知道是否应该使用release()还是reset()。我已经查看了之前在SO上提出的问题,但我认为它没有提供精确的解释来确定使用哪种方法。
注意:完成播放此音频文件后,我也应该能够播放其他音频文件(在播放完此音频文件后,当我单击同一活动中的其他项目时,我应该能够获得声音)。
    linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pronounce = MediaPlayer.create(context, currentWord.getPronounceResourceID());
            pronounce.start();
            pronounce.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer player) {
                    //pronounce.release();
                    //pronounce.reset();
                }
            });
        }
    });

1
你说你有不同的活动需要这个功能。你打算为所有活动使用相同的“发音”媒体播放器实例吗? - Shaishav
@Shaishav,除了这个WordAdapter类之外,我没有在任何活动中使用pronounce - Siddharth Venu
1个回答

6

在执行 release 操作之前,需要进行一次 reset 操作,但我怀疑只需要执行 release 操作。

以下方法可能更易于管理:

    public void onClick(View view) {
        if (pronounce != null) {
            pronounce.reset();
            pronounce.release();
            pronounce = null;
        }
        pronounce = MediaPlayer.create(context, currentWord.getPronounceResourceID());
        pronounce.start();
   }
reset方法会停止任何媒体播放并将MediaPlayer实例返回到空闲状态,与创建时完全相同。 release方法销毁媒体播放器并释放大部分非托管资源。当调用release时,应将实例变量设置为null,以便对象的其余部分可以进行垃圾回收。
如果您在后续点击中重复使用现有的mediaplayer实例,则可能会获得更好的性能。

如果用户再次点击适配器并播放新文件,那么在这种情况下,release() 方法不会显得有些过度吗? - Shaishav
但是释放对象不会导致对象变得无用吗?例如,如果我点击其中一个线性布局,则会播放音频并释放该对象。然后,如果我点击另一个,那么它不会出现错误吗? - Siddharth Venu
1
如果您没有注意到在每次单击时释放和创建新的MediaPlayer实例会导致性能下降(延迟),那么请继续使用该设计,因为它是最简单的管理方式。否则,请考虑仅调用“reset”并使用“setDataSource”更改正在播放的文件。 - selbie
2
reset 之后,你可以调用 setDataSource 方法然后跟着调用 prepare 方法。然后你就可以再次调用 start 方法了。 - selbie
1
如果你调用了 release,你应该立即将变量设置为 null 以便再次调用 create。无论如何,不要让 pronounce 变量引用一个已经失效的对象。 - selbie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接