我有大约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);
}
在弱设备上,由于声音数量较多,应用程序崩溃。太长“装载”。我该如何解决这个问题?
答案 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,则应该从磁盘加载它。