1

私はRecyclerViewで活動します。アクティビティが完了したら、RecyclerView ViewHolderでスレッドを停止できますか?

RecyclerViewには、シークバーと再生ボタンで曲リストを作成しました。

はシークバーでは、これはスレッド

しかし、変更アクティビティーを使用して音楽の現在位置を移動し、音楽は私が活動を変更したときに、私が欲しい

を停止したがエラーになり、音楽が停止し、エラーではありません

助けてください

//seekbar change listener 
seekbar.setMax(music.getDuration()); 

seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 
     // TODO Auto-generated method stub 
     if(fromUser) 
      music.seekTo(progress); 
    } 
}); 

//music playing 
public void button(View v){ 
if(music.isPlaying()){ 
    music.stop(); 
    try { 
     music.prepare(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    music.seekTo(0); 

    button.setText(R.string.start); 
    seekbar.setProgress(0); 
    }else{ 
    music.start(); 
    button.setText(R.string.stop); 

    Thread(); 
} 
} 

//Thread 
public void Thread(){ 
    Runnable task = new Runnable(){ 
     public void run(){ 

      while(music.isPlaying()){ 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       seekbar.setProgress(music.getCurrentPosition()); 
      } 
     } 
    }; 
    Thread thread = new Thread(task); 
    thread.start(); 
} 
+0

あなたはonStop()またはonPause()メソッドでメソッドを終了しようとしましたか? – ZeroOne

+0

私は試みましたが、それがrecyclerview.viewholderにある場合に備えて、私はonStop()またはonPauseメソッドを使用できません –

答えて

0

スレッドは、アクティビティまたはフラグメントでのみ殺すことができます。このクラスを使用して、リサイクルビューのクリックリスナーをオーバーライドします。

新しいJavaファイルを作成し、あなたの活動にRecyclerItemClickListener.java

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 
    private OnItemClickListener mListener; 

    public interface OnItemClickListener { 
     void onItemClick(View view, int position); 
    } 

    private GestureDetector mGestureDetector; 

    public RecyclerItemClickListener(Context context, OnItemClickListener listener) { 
     mListener = listener; 
     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
     View childView = view.findChildViewUnder(e.getX(), e.getY()); 
     if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
      mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     } 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
     // do nothing 
    } 
} 

/フラグメントは今

yourRecyclerviewId.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view1, int position) { 
      //view1 - is clicked view 
      //position - position of the clicked list 

      //put your method in here 

     } 
})); 

、あなたがスレッドまたはサービスを殺すためにOnPause()とOnStop()メソッドを使用することができます名前

関連する問題