一个公共媒体播放器类,用于所有活动

时间:2017-01-18 22:14:25

标签: java android android-mediaplayer

更新

在推荐之后,我决定在一个新线程中运行媒体播放器。因为只有当活动在屏幕上时我才需要媒体播放器。这是新代码:

首先,我在多个类中使用的公共SingleMP(Media Player)类:

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工作得更顺畅了。

1 个答案:

答案 0 :(得分:3)

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

我可能会创建一个服务来创建一个持有媒体播放器的新线程。然后,您的每个活动都可以绑定到服务以控制媒体播放器。

请参阅Extending the service class

部分

您还可以查看the media player sample