大家好,我是Android应用开发的新手。我在尝试将MediaPlayer的处理逻辑从MainActivity分离到另一个类时遇到了一些问题。尽管我已经搜索了很长时间,但仍然没有找到满意的解决方案。
具体来说,我创建了一个非常简单的布局,其中包含一个ToggleButton用于启动和停止某些声音。最初,我在MainActivity类中直接调用了MediaPlayer。现在,我想将MediaPlayer的处理逻辑移到一个单独的类中,以便可以从一个小部件中调用这些方法。然而,当我尝试在新类中使用Toast或调用MediaPlayer的方法时,需要引用MainActivity的实例,而我不清楚如何正确地进行引用。
以下是相关代码:
主Activity类(MainActivity.java):
package com.heavyloadreverse;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ToggleButton;
public class MainActivity extends Activity {
private Sound snd;
private ToggleButton btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (ToggleButton) findViewById(R.id.btn_OnOff);
snd = new Sound();
snd.mp_create(MainActivity.this);
}
public void onToggleClicked(View v) {
if (((ToggleButton) v).isChecked()) {
snd.mp_start();
} else {
snd.mp_stop();
}
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onRestart() {
super.onRestart();
btn.setChecked(false);
}
@Override
public void onResume() {
super.onResume();
btn.setChecked(false);
}
@Override
public void onPause() {
super.onPause();
snd.mp_stop();
}
@Override
public void onStop() {
super.onStop();
snd.mp_stop();
}
@Override
public void onDestroy() {
super.onDestroy();
snd.mp_stop();
}
}
处理MediaPlayer的类(Sound.java):
package com.heavyloadreverse;
import android.app.Application;
import android.content.Context;
import android.media.MediaPlayer;
import android.widget.Toast;
public class Sound extends Application {
private MediaPlayer mp;
private Context context;
public void mp_create(Context context) {
this.cOntext= context;
Toast.makeText(context, "test", Toast.LENGTH_SHORT).show();
mp = MediaPlayer.create(context, R.raw.truckreverse);
}
public void mp_start() {
Toast.makeText(context, R.string.start, Toast.LENGTH_SHORT).show();
try {
mp.setLooping(true);
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
public void mp_stop() {
try {
mp.stop();
mp.prepare();
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
}
在执行时,我遇到了以下运行时错误:
03-12 20:23:18.412: E/AndroidRuntime(862): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.heavyloadreverse/com.heavyloadreverse.MainActivity}: java.lang.NullPointerException
具体的错误信息如下:
- main无法解析为类型
- 行断点:声音[line:15] - mp_create(MainActivity)
- 在范围内无法访问MainActivity类型的封闭实例
为了使“Sound.java”中的Toast和MediaPlayer调用正常工作,我应该如何解决这些问题?
非常感谢大家的帮助。
斯文