2015-03-23 3 views
0

Мое приложение продолжает сбой из-за перегрузки памяти. Раньше у меня было несколько звуковых пулов, но теперь я изменил это, поэтому я использую только один звуковой пул для всего приложения. Это называется «Clubb1». Однако мое приложение все еще терпит крах после открытия третьего фрагмента, я думаю, что мне нужно выпустить звуки, как только они закончили играть, чтобы память не была занята. Я прав? Если да, то как мне это сделать? Я новичок во всем этом кодировании, поэтому я немного смущен.Как я могу освободить свой медиафайл soundPool?

Вот мой первый фрагмент:

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

Позвоните release() на свой Clubb1 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; 
     } 
    } 
} 
+0

Как бы это записать в мой код? –

+0

Поместите его в свой прослушиватель 'OnClick', с флагом, видя, играет ли предыдущая песня, и если тогда вызывается' release' –

+0

, каков будет код, который мне нужно будет написать? жаль, что я не очень хорош в этом –

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

+0

Как я могу написать release() для моего звукового пула? –

+0

Clubb1.release(); – Omar

+0

Где я могу разместить это в своем коде? –