java - 一个公共(public)媒体播放器类可用于所有 Activity

标签 java android android-mediaplayer

已更新。

根据建议,我决定在新线程中运行媒体播放器。因为只有当屏幕上有 Activity 时我才需要媒体播放器。这是新代码:

首先,我的公共(public) SingleMP(媒体播放器)类在多个类中使用:

import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;

public class SingleMP implements Runnable
{
    public static MediaPlayer mp;
    private static Context context;
    private static Uri uri;

    public SingleMP(Context context, Uri uri){
    this.context= context;
    this.uri= uri;
    }

    @Override
    public void run(){
        try {
            if (mp != null) {
                mp.stop();
                mp.reset();
                mp.release();
                mp = null;
            }

            mp = MediaPlayer.create(context, uri);
            mp.start();
        } catch (Exception e) {
            if (mp != null) {
                mp.stop();
                mp.reset();
                mp.release();
                mp = null;
            }
            e.printStackTrace();
            mp = MediaPlayer.create(context, uri);
            mp.start();
        }
    }

    // Called in OnDestroy of used class.
    public static void mpstop()
    {
        if (mp != null) {
            mp.stop();
            mp.reset();
            mp.release();
            mp = null;
        }
    }
}

以及在另一个 Java 类中使用它的示例:

public class MainMenu
{
    private Uri uri;
    private Runnable MPthread;

    public void onCreate(Bundle savedInstanceState)
    {
        RadioButton rbtnA = (RadioButton) findViewById(R.id.radio0);
        rbtnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                // Assign a sound from raw folder.
                uri =Uri.parse("android.resource://"+getPackageName()+"/raw/nice");
                MPthread = new SingleMP(MainMenu.this, uri));
                new Thread(MPthread).start();               
                }
             }
        });

        RadioButton rbtnB = (RadioButton) findViewById(R.id.radio1);
        rbtnB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                // Assign a sound from raw folder.
                uri =Uri.parse("android.resource://"+getPackageName()+"/raw/morning");
                MPthread = new SingleMP(MainMenu.this, uri));
                new Thread(MPthread).start();
                }
             }
         });

    }


    @Override
    protected void onDestroy() {
            super.onDestroy();

    if(MPthread!=null) {
        SingleMP.mpstop();
    }

    }
}

你觉得怎么样?看起来我的 UI 工作起来更流畅了一些。

最佳答案

您的媒体播放器实例将驻留在主线程上,即 UI 线程。不建议这样做。

我可能会创建一个服务来创建一个保存媒体播放器的新线程。然后,您的每个 Activity 都可以绑定(bind)到服务来控制媒体播放器。

参见Extending the service class部分.

您还可以查看the media player sample .

关于java - 一个公共(public)媒体播放器类可用于所有 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41730394/

相关文章:

Android - MediaRecorder - 应用程序失去了表面

java - 使用正则表达式 Java 在其他已知(但可选)字符串之间查找未知子字符串

java - 显示来自 JUnit 测试的小程序

Java add() 方法约定

android - 能否将 VectorDrawable pathData 转换为 Path 对象

android - 我的应用占用高 CPU

android - 如何在android浏览器上打开嵌入在url中的音频和视频

android - 媒体播放器过早切断声音

android - MediaPlayer getDuration 返回 -1412558917

java - 输入证书之前检查 CA 的证书吗?