如何发布我的soundPool媒体?

时间:2015-03-23 21:07:40

标签: android android-fragments release soundpool ondestroy

我的应用因内存过载而继续崩溃。在我有多个声音池之前,但现在我已经改变了这个,所以我只为整个应用程序使用一个声音池。这被称为'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;
}}

我在代码中添加了什么以及什么来减轻我正在使用的内存量?并阻止我的应用程序崩溃?

2 个答案:

答案 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

以适当的方式释放它们