0

さて、私はすべてを検索し、たくさんの読み取りを行いましたが、以下のコードで何が間違っているのか、特に私がやろうとしていることを実行する際のメモリリークの懸念がわかりました. しかし、これを別の方法で行う方法がよくわかりません。コードは次のとおりです。

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 としてハッシュマップを作成するのが最善だと思います。これを行うと、メインのアプリケーション コードが台無しになります。それは本当に問題ではないと思いますが、これが正しいアプローチなのか、それとももっと良い方法があるのか​​ 疑問に思っていました.

4

0 に答える 0