如何在不创建新实例的情况下从另一个类访问变量

时间:2011-02-11 17:34:34

标签: java android


我正在编写我的第一个Android应用程序,一个简单的媒体播放器,只是为了练习我的半体面的java /标记技能。
该应用程序将现在播放的屏幕作为“主要”页面以及歌曲浏览器和弹出式音乐控件。我在前者和后者都做了一些工作,但我遇到了MediaPlayer的问题。如果我开始播放歌曲,它将播放并暂停,直到我退出音乐控制对话框,然后重新输入。此时,它似乎创建了MediaPlayer对象的第二个实例。

主播放器屏幕

package org.practicesession.zoomplayer;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;

public class zoomPlayer extends Activity implements OnClickListener {
    static MediaPlayer myPlayer;
    private static int stateMediaPlayer;

    /** Called when the activity is first created. */ 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        View returnButton = findViewById(R.id.button_return);
        returnButton.setOnClickListener(this);
        View playerControls = findViewById(R.id.album_art_panel);
        playerControls.setOnClickListener(this);
        View playlistView = findViewById(R.id.song_info_panel);
        playlistView.setOnClickListener(this);
        View shuffleButton = findViewById(R.id.player_shuffle_button);
        shuffleButton.setOnClickListener(this);
        View repeatButton = findViewById(R.id.player_repeat_button);
        repeatButton.setOnClickListener(this);
        View ratingButton = findViewById(R.id.player_rating_button);
        ratingButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.album_art_panel:
            Intent i = new Intent(this, PlayerControls.class);
            startActivity(i);
            break;
        }

    }

    public static void setStateMediaPlayer(int i){
        stateMediaPlayer = i;
    }

    public static int getStateMediaPlayer(){
        return stateMediaPlayer;
    }
}

弹出控件

package org.practicesession.zoomplayer;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

//Extends to implement the functionality of the main page
public class PlayerControls extends Activity implements OnClickListener{
    private final int stateMP_Playing = 1;
    private final int stateMP_Pausing = 2;


    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playcontrols);

        View exitButton = findViewById(R.id.controls_exit_pane);
        exitButton.setOnClickListener(this);
        View volUpButton = findViewById(R.id.controls_vol_up);
        volUpButton.setOnClickListener(this);
        View playButton = findViewById(R.id.controls_play);
        playButton.setOnClickListener(this);
        View volDownButton = findViewById(R.id.controls_vol_down);
        volDownButton.setOnClickListener(this);

        musicPlayback();
    }
    public void musicPlayback(){
        zoomPlayer.myPlayer = new  MediaPlayer();
        zoomPlayer.myPlayer = MediaPlayer.create(this, R.raw.outta);
        zoomPlayer.setStateMediaPlayer(stateMP_Pausing);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.controls_exit_pane:
            finish();
            break;
        case R.id.controls_play:
            switch(zoomPlayer.getStateMediaPlayer()){
                case stateMP_Playing:
                    zoomPlayer.myPlayer.pause();
                    zoomPlayer.setStateMediaPlayer(stateMP_Pausing);
                    break;
                case stateMP_Pausing:
                    zoomPlayer.myPlayer.start();
                    zoomPlayer.setStateMediaPlayer(stateMP_Playing);
                    break;
            }
            break;
        }
    }


}

这似乎是一个普通的java问题,而不是其他任何问题。我已经尝试过set / get方法,静态变量,删除继承等无济于事

请注意上面的代码是因为这几个小时搞错了所以它不是那么整洁......例如,控件屏幕最初从主屏幕继承了许多导入和方法是共享的。我删除了这个以查看它是否导致问题但没有快乐

感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

我只是猜测这是因为你每次都在创建一个新的MediaPlayer? zoomPlayer.myPlayer = new MediaPlayer(); 尝试在别处创建它,然后在那里初始化

答案 1 :(得分:3)

  

如果我开始播放歌曲,它将播放并暂停,直到我退出音乐控制对话框,然后重新输入。此时,它似乎创建了MediaPlayer对象的第二个实例。

这就是你的代码告诉Android要做的事情。在Java中,new运算符创建一个类的新实例。每次调用MediaPlayer活动的onCreate()时,您都会创建新的PlayerControls。每当您致电startActivity()以启动PlayerControls活动时,都会发生这种情况。

通常,在Android中,音乐播放器将通过执行实际音乐播放的Service来实现。这样,用户就无法与您的任何特定活动联系在一起。该服务将使用startForeground()来确保它不会被Android关闭,此外,它会在状态栏中显示一个图标,提醒用户您的应用是导致音乐的原因(可能还会让他们快速访问你的活动)。

答案 2 :(得分:0)

您正在使用onCreate方法在弹出窗口中实例化MediaPlayer。不要在弹出窗口中实例化它,而是在Activity中执行一次。

答案 3 :(得分:0)

正如布伦特所说;也许只是创建它,如果还不存在:

public void musicPlayback()
{
    if (zoomPlayer.mPlayer == null)
    {
        zoomPlayer.myPlayer = MediaPlayer.create(this, R.raw.outta);
    }
    zoomPlayer.setStateMediaPlayer(stateMP_Pausing);
}

(您不应该创建new MediaPlayer - 只需使用静态create()方法。