さて、私はすべてを検索し、たくさんの読み取りを行いましたが、以下のコードで何が間違っているのか、特に私がやろうとしていることを実行する際のメモリリークの懸念がわかりました. しかし、これを別の方法で行う方法がよくわかりません。コードは次のとおりです。
public class SoundPlayer extends Activity {
private String sound;
private SoundPool soundPool;
private float fSpeed = 1;
private int resID;
public SoundPlayer(String s) {
sound = s;
}
public SoundPlayer(String s, float f) {
sound = s;
fSpeed = f;
}
public void playSound() {
resID = WorkoutStopwatch.getResources().getIdentifier(sound, "raw", "com.blueflamesys.workoutstopwatch");
AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = streamVolumeCurrent / streamVolumeMax;
soundPool.play(resID, volume, volume, 1, 0, fSpeed);
}
}
サウンドを再生するアクティビティを作成しようとしています (ただし、私が見たいくつかの読書の後、アクティビティではなくクラスが必要だと思います)。この音は多くの未加工ファイルの 1 つであるため、resID 変数の設定と、非静的メソッドから getResources() を呼び出そうとするとエラーが発生します。リファクタリングされたクラスは次のようになります。
public class SoundPlayer extends {
private SoundPool soundPool;
private float fSpeed = 1;
private int resID;
public SoundPlayer(int r) {
resID = r;
}
public SoundPlayer(int r, float f) {
resID = r;
fSpeed = f;
}
public void playSound() {
soundPool.play(resID, 1, 1, 1, 0, fSpeed);
}
}
String で対処したいサウンドが複数あるので、キーをサウンドを表す文字列として、値を int resID としてハッシュマップを作成するのが最善だと思います。これを行うと、メインのアプリケーション コードが台無しになります。それは本当に問題ではないと思いますが、これが正しいアプローチなのか、それとももっと良い方法があるのか 疑問に思っていました.