我的应用因内存过载而继续崩溃。在我有多个声音池之前,但现在我已经改变了这个,所以我只为整个应用程序使用一个声音池。这被称为'Clubb1'。然而我的应用程序在打开第三个片段后仍然崩溃,我想我需要在完成播放后释放声音,以便不占用内存。我对吗?如果是这样我该怎么办?我是所有这些编码的新手,所以我有点困惑。
这是我的第一个片段:
public class FragmentOne extends Fragment {
SoundPool Clubb1;
int clubb1Id;
int clubb2Id;
int clubb3Id;
int clubb4Id;
int clubb5Id;
int clubb6Id;
int clubb7Id;
int clubb8Id;
int clubb9Id;
int clubb10Id;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
Clubb1 = new SoundPool(10, AudioManager.STREAM_MUSIC, 1);
clubb1Id = Clubb1.load(getActivity(), R.raw.clubb1, 1);
clubb2Id = Clubb1.load(getActivity(), R.raw.clubb2, 1);
clubb3Id = Clubb1.load(getActivity(), R.raw.clubb3, 1);
clubb4Id = Clubb1.load(getActivity(), R.raw.clubb4, 1);
clubb5Id = Clubb1.load(getActivity(), R.raw.clubb5, 1);
clubb6Id = Clubb1.load(getActivity(), R.raw.clubb6, 1);
clubb7Id = Clubb1.load(getActivity(), R.raw.clubb7, 1);
clubb8Id = Clubb1.load(getActivity(), R.raw.clubb8, 1);
clubb9Id = Clubb1.load(getActivity(), R.raw.clubb9, 1);
clubb10Id = Clubb1.load(getActivity(), R.raw.clubb10, 1);
View rootView = inflater.inflate(R.layout.fragment_one_layout, container, false);
Button buttonA = (Button) rootView.findViewById(R.id.buttonA);
Button buttonB = (Button) rootView.findViewById(R.id.buttonB);
Button buttonC = (Button) rootView.findViewById(R.id.buttonC);
Button buttonD = (Button) rootView.findViewById(R.id.buttonD);
Button buttonE = (Button) rootView.findViewById(R.id.buttonE);
Button buttonF = (Button) rootView.findViewById(R.id.buttonF);
Button buttonG = (Button) rootView.findViewById(R.id.buttonG);
Button buttonH = (Button) rootView.findViewById(R.id.buttonH);
Button buttonI = (Button) rootView.findViewById(R.id.buttonI);
Button buttonJ = (Button) rootView.findViewById(R.id.buttonJ);
View.OnClickListener ocl = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.buttonA:
//A clicked
Clubb1.play(clubb1Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonB:
//B clicked
Clubb1.play(clubb2Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonC:
//C clicked
Clubb1.play(clubb3Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonD:
//D clicked
Clubb1.play(clubb4Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonE:
//E clicked
Clubb1.play(clubb5Id, 3, 3, 1, 0, 1);
break;
case R.id.buttonF:
//F clicked
Clubb1.play(clubb6Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonG:
//G clicked
Clubb1.play(clubb7Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonH:
//H clicked
Clubb1.play(clubb8Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonI:
//I clicked
Clubb1.play(clubb9Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonJ:
//J clicked
Clubb1.play(clubb10Id, 1, 1, 1, 0, 1);
break;
}
}
};
buttonA.setOnClickListener(ocl);
buttonB.setOnClickListener(ocl);
buttonC.setOnClickListener(ocl);
buttonD.setOnClickListener(ocl);
buttonE.setOnClickListener(ocl);
buttonF.setOnClickListener(ocl);
buttonG.setOnClickListener(ocl);
buttonH.setOnClickListener(ocl);
buttonI.setOnClickListener(ocl);
buttonJ.setOnClickListener(ocl);
return rootView;
}}
我在代码中添加了什么以及什么来减轻我正在使用的内存量?并阻止我的应用程序崩溃?
答案 0 :(得分:0)
在您的Clubb1 release()
实例上调用SoundPool
,以便在何时何地释放SoundPool
使用的内存。
public class FragmentOne extends Fragment implements View.OnClickListener , SoundPool.OnLoadCompleteListener {
SoundPool Clubb1;
Integer currentBtnId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState
) {
View rootView = inflater.inflate(R.layout.fragment_one_layout, container, false);
Clubb1 = new SoundPool(10, AudioManager.STREAM_MUSIC, 1);
Button buttonA = (Button) rootView.findViewById(R.id.buttonA);
Button buttonB = (Button) rootView.findViewById(R.id.buttonB);
Button buttonC = (Button) rootView.findViewById(R.id.buttonC);
Button buttonD = (Button) rootView.findViewById(R.id.buttonD);
Button buttonE = (Button) rootView.findViewById(R.id.buttonE);
Button buttonF = (Button) rootView.findViewById(R.id.buttonF);
Button buttonG = (Button) rootView.findViewById(R.id.buttonG);
Button buttonH = (Button) rootView.findViewById(R.id.buttonH);
Button buttonI = (Button) rootView.findViewById(R.id.buttonI);
Button buttonJ = (Button) rootView.findViewById(R.id.buttonJ);
buttonA.setTag(R.raw.clubb1);
buttonB.setTag(R.raw.clubb2);
buttonC.setTag(R.raw.clubb3);
buttonD.setTag(R.raw.clubb4);
buttonE.setTag(R.raw.clubb5);
buttonF.setTag(R.raw.clubb6);
buttonG.setTag(R.raw.clubb7);
buttonH.setTag(R.raw.clubb8);
buttonI.setTag(R.raw.clubb9);
buttonJ.setTag(R.raw.clubb10);
buttonA.setOnClickListener(this);
buttonB.setOnClickListener(this);
buttonC.setOnClickListener(this);
buttonD.setOnClickListener(this);
buttonE.setOnClickListener(this);
buttonF.setOnClickListener(this);
buttonG.setOnClickListener(this);
buttonH.setOnClickListener(this);
buttonI.setOnClickListener(this);
buttonJ.setOnClickListener(this);
Clubb1.setOnLoadCompleteListener(this);
return rootView;
}
@Override
public void onClick(View v) {
if(currentBtnId != null){
Clubb1.release();
}
currentBtnId = v.getId();
int sampleId = (Integer) v.getTag();
Clubb1.load(getActivity(), sampleId, 1);
}
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
switch (currentBtnId){
case R.id.buttonE:
//E clicked
soundPool.play(sampleId, 3, 3, 1, 0, 1);
break;
default:
soundPool.play(sampleId, 1, 1, 1, 0, 1);
break;
}
}
}
答案 1 :(得分:0)
为了正确加载并避免在创建片段时将滞后放入其正确的onClick位置,如下所示:
View.OnClickListener ocl = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.buttonA:
//A clicked
clubb1Id = Clubb1.load(getActivity(), R.raw.clubb1, 1);
Clubb1.play(clubb1Id, 1, 1, 1, 0, 1);
break;
case R.id.buttonB:
//B clicked
clubb2Id = Clubb1.load(getActivity(), R.raw.clubb2, 1);
Clubb1.play(clubb2Id, 1, 1, 1, 0, 1);
break;
//And so on ....
}
}
然后,当您完成后,通过致电release()
SoundPool