的Soundpool。在弱设备上,由于声音数量较多,应用程序崩溃

时间:2015-03-03 21:27:53

标签: java android soundpool

我有大约200个声音。每声音不超过30Kb。我用来加载OnGreate

Sound = loadSound ("sound.ogg");

和方法

private int loadSound (String fileName) {
         AssetFileDescriptor afd = null;
         try {
             afd = mAssetManager.openFd (fileName);
         } Catch (IOException e) {
             e.printStackTrace ();
             return -1;
         }
         return mSoundPool.load (afd, 1);
     }

在弱设备上,由于声音数量较多,应用程序崩溃。太长“装载”。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我知道你想要预加载所有的声音以加快播放它们,但是这会减慢加载应用程序的时间" onCreate"应用程序可能会崩溃"。通过使用缓存管理器在后台线程中预加载声音,同时仍然确保它们在需要时可用时,您可以充分利用这两个选项。即使在一周的设备上,加载声音也不会有任何问题,因为它应该少于6MB的总内存消耗。这样的事情应该做:

public class SoundCache {
    private HashMap<String, Integer> sounds = Collections.synchronizedMap(new HashMap<>());

    public int getSound(String fileName){
        Integer sound = cache.get(fileName);
        if(sound == null){
            sound = loadSound(fileName);
            cache.put(fileName, sound);
        }
        return sound;
    }

    public void preload(final String... fileNames){
        new Thread(){
            for(String fileName : fileNames){
                getSound(fileName);
            }
        }.start();
    }
}

然后在您现有的应用程序代码中。你而不是这个:

public class YourExistingClass{
    private int sound1;
    private int sound2;
    ...
    public void onCreate(){
        ...
        sound1 = loadSound("sound1.ogg");
        sound2 = loadSound("sound2.ogg");
        ...
    }
    ...
    public void handleEvent1(){
        ...
        play(sound1);
        ...
    }
}

做这样的事情:

public class YourExistingClass{
    private SoundCache soundCache  = new SoundCache();
    private String sound1 = "sound1.ogg";
    private String sound2 = "sound2.ogg";
    ...
    public void onCreate(){
        ...
        soundCache.preload(sound1,sound2
        ...
        );
        ...
    }
    ...
    public void handleEvent1(){
        ...
        play(soundCache.getSound(sound1));
        ...
    }
}

答案 1 :(得分:0)

您可以使用内存缓存来存储类似于此位图示例from the android developer page执行操作的声音。

只需将声音类型替换为Bitmap类型,您应该能够使用可用设备内存的一小部分来制作声音的内存缓存。这样,你就不会因分配太多内存而崩溃。

如果在缓存中搜索Sound后返回null,则应该从磁盘加载它。