2017-09-04 6 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

メディアプレーヤーを「リッスン」しているのはなぜですか?ユーザーインタラクションに反応する必要がある場合は、2つのリスナーを追加しないでください: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

@ LuckyXII助けてくれましたか? – Gotiasits

+0

なし申し訳ありませんが、それは十分に速くクリックするだけであるため、プロセスを終了することができlongClick遅延(私はそれが原因だったとhowver全くわからないの、既にリリースされたリソースを解放しようとすると、IllegalStateExceptionがスローする問題を解決している場合がありますしかし)。 しかし、オーディオファイルの長さが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); 
      } 
     } 
    }); 
} 
関連する問題