繁体   English   中英

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

[英]How do I access a variable from another class without it creating a new instance


我正在编写我的第一个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方法,静态变量,删除继承等无济于事

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

谢谢你的帮助!

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM