2017-09-04 19 views
0

저는 현재 안드로이드와 현재 RecyclerView를 배우고 있습니다. 따라서이 예제에서는 재생 버튼을 클릭하고 완료되면 특정 원시 사운드 파일을 재생하고 있습니다. 나는 매우 빠르게 재생 누르면 내가 IllegalStateException이를 얻을 것이다, 그래서 나는 상태를 환승에 문제가RecyclerView에서 오디오 재생 및 해제

  • : 나는 진지하게 내가 몇 가지 문제와 질문이 그러나 가장 좋은 방법이 무엇인지에 대한 몇 가지 포인터를 사용할 수 있습니다, 아마도 이미 출시 된 플레이어를 출시하려고 시도했을 것입니다.
  • 나는 분명히 또한 출시 후 무효화해야하고 null을 먼저 확인해야합니다. 그러나 중첩 된 범위에서 사용하고 있기 때문에 최종 선언해야하고 혼동을 일으킬 수 없습니다. 분명히 놓쳤습니다. 어떤 것. onBindViewHolder의 항목에 clickListner을 설정
  • 도 크게 느린과 viewHolder 클래스의 전체 행에 clickListner을 추가하는 것보다 덜 반응하는 것 같다.

당신의 MediaPlayer를 설정 및 RecyclerView 제대로 자원을 관리하고 무엇을 내가 충돌 및 "느림"을 일으킬 것이라고 잘못하고 있는가에 대한 가장 좋은 방법은 무엇입니까?

// ViewHolder

public static class myHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 


    ImageView playBtn; 

    public myHolder(View v){ 
     super(v); 
     playBtn = (ImageView) v.findViewById(R.id.playBtn); 
     v.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
    } 

} 

// onBindViewHolder/onCompletionListener

@Override 
public void onBindViewHolder(myHolder holder, int position) { 
    myClass item = itemList.get(position); 
    final MediaPlayer mediaPlayer = MediaPlayer.create(holder.itemView.getContext(), item.getAudioSource()); 

    holder.playBtn.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 

      mediaPlayer.start(); 
      mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mp) { 
        mp.release(); 
       } 
      }); 
     } 
    }); 
} 
+0

왜 미디어 플레이어에서 "듣고 있습니까?"사용자 상호 작용에 반응해야하는 이유는 두 개의 리스너를 추가하지 않는 이유는 onLongClick() 및 onClick()입니다. LongClick을 시작할 수 있으며 사용자가 누르는 것을 멈 추면 onClick()이 자동으로 호출되어 재생을 중지 할 수 있습니다. – Gotiasits

+0

실제로 연주하는 것을 멈출 필요가 없습니다. 사용하는 사운드 파일은 1-2 초입니다. setOnCompleteListener는 파일 재생이 끝나면 모든 리소스를 해제합니다. – LuckyXII

답변

0

만 사용자 상호 작용에 듣고있는 경우에 당신은 (코드를 중지/setOnCompleteListener()을 삭제하고 대신 플레이를 정의 할 수 있습니다 순서대로) OnLongClickListener()OnClickListener. 이처럼 :

holder.playBtn.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     //Code to stop playing and release resources 
    } 
}); 

holder.playBtn.setOnLongClickListener(new View.OnClickListener(){ 
     @Override 
     public void onLongClick(View v) { 
      //Code to start playing 

      return false; //!!This is important so that OnClick() would be called after releasing the button 
     } 
    }); 
+0

@ 럭키 XII 도움이 되셨습니까? – Gotiasits

+0

죄송 합니다만, 충분히 빠른 클릭이 이미 릴리스 된 리소스를 해제하고 illegalStateException을 던지려고 시도하지만 프로세스가 완료 될 수 있도록 longClick 지연이 있기 때문에 문제가 해결되었을 수도 있습니다 (나는 그것이 전체 원인이라고 완전히 확신하지 못했습니다. 그래도). 그러나 오디오 파일의 길이가 1 ~ 2 초 밖에되지 않기 때문에 긴 대기 시간이 너무 길어서 부드럽고 문제에 대한 실질적인 해결책이 아닙니다. 나는 잘 작동한다고 생각하는 해결책을 찾았지 만, 나는 그와 함께 나온 사람이고 나는 절대 신참이다. "좋은"실천이라면 말할 수 없다. – LuckyXII

+0

음, onLongClick은 소리를 즉시 실행해야한다. 어쨌든 피드백에 감사드립니다. 행운을 빕니다! – Gotiasits

0

OBS 나는 내 자신의 질문에 나는이 acctualy 좋은 방법이라고 말할 수 있지만 사람이 오류를 점이나 더 나은 더 효율적이있는 경우는, 내가 가지고 있던 문제를 해결 않았다 대답 해요으로 그런 다음 대답을 게시하고 정교하게하십시오.

  • 대신에 onBindViewHolder를 선언하여 클래스 변수로 만들었습니다. 이렇게하면 최종 버전을 피하고 출시 후 무효화 할 수 있습니다.
  • 그런 다음이를 onClick 메서드 내에서 정의하여 대신 null이 아니며 필요할 때 항상 선언되도록하십시오.
  • 나는 나의 홀더와 "항목의"onclick을 내부에서이를 사용하기 위해 최종했습니다하지만이 일 것으로 보인다 (recyclerView의 마법 같아요)

응용 더 이상 충돌과 onCompletionListener 모두 취소한다

// 클래스 변수 MediaPlayer를하고 onCompletionListener 방법

MediaPlayer mediaPlayer; 

//onCompletionListener method 
MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mp.release(); 
     mediaPlayer = null; 
    } 
}; 

// onBindViewHolder

: 자원이 현재 코드
@Override 
public void onBindViewHolder(final itemHolder holder, int position) { 
    final Items item = mItemList.get(position); 

    holder.playBtn.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      mediaPlayer = MediaPlayer.create(holder.itemView.getContext(), item.getAudioSource()); 
      if(mediaPlayer != null) { 
       mediaPlayer.start(); 
       mediaPlayer.setOnCompletionListener(mCompletionListener); 
      } 
     } 
    }); 
}