[英]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.