android - 在继续应用程序之前等待 SoundPool 加载

标签 android soundpool

我按照教程将 SoundPool 集成到我的应用程序中,这是教程中给出的代码:

package com.example.soundpoolexample;

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class SoundPoolExample extends Activity implements OnTouchListener {
    private SoundPool soundPool;
    private int soundID;
    boolean loaded = false;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        View view = findViewById(R.id.textView1);
        view.setOnTouchListener(this);
        // Set the hardware buttons to control the music
        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        // Load the sound
        soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
        soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                    int status) {
                loaded = true;
            }
        });
        soundID = soundPool.load(this, R.raw.sound1, 1);

    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            // Getting the user sound settings
            AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
            float actualVolume = (float) audioManager
                    .getStreamVolume(AudioManager.STREAM_MUSIC);
            float maxVolume = (float) audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
            float volume = actualVolume / maxVolume;
            // Is the sound loaded already?
            if (loaded) {
                soundPool.play(soundID, volume, volume, 1, 0, 1f);
                Log.e("Test", "Played sound");
            }
        }
        return false;
    }
}

问题是,我想确保应用程序仅在成功加载 SoundPool 后才向前移动,而不必在每次播放声音之前检查它是否已加载。我该怎么做?

我确信这是一个糟糕的解决方案,但是在我在 onCreate 中加载声音文件后,这样的事情会起作用吗?:

...

    soundID = soundPool.load(this, R.raw.sound1, 1);
    while (!loaded) {}

...

我相信有更好的方法。

最佳答案

您可以使用 Semaphore 获得一个优雅的解决方案,但是请尽量避免阻塞 onCreate(),因为应用程序不会响应,这里的代码只是为了说明Semaphore

的使用
public class SoundPoolExample extends Activity implements OnTouchListener {

public static final Semaphore semaphore = new Semaphore(0);

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId,
                int status) {

            semaphore.release();
        }
    });
    soundID = soundPool.load(this, R.raw.sound1, 1);

    // Will block since there is not permits (the semaphore is initialized with 0)
    // then will continue once semaphore.release(); is called i.e. after loading is finished
    semaphore.acquire();
} 

// rest of your class

}

关于android - 在继续应用程序之前等待 SoundPool 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782579/

相关文章:

android - Jenkins - 使用 Genymotion VM 而不是 Android Emulator

Android - 如何使用 Spinner 隐藏/显示 View 对象

android - 样本未准备好音池

android - Soundpool 只播放文件的前 5 秒。为什么?

Android:录制 SoundPool 输出

Android 连接 USB 时触摸屏有延迟

android - 带有动态列表的数字选择器

java - getBoolean 不会接受带有 getSharedPreferences 的字符串键

android - 知道在 Android 1.6/2.0/2.1 上使用 SoundPool 加载声音是否成功

java - 我似乎找不到如何将 SoundPool 添加到我的特定游戏