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

線程只能在Activity或Fragment中被殺死。使用此類來覆蓋您的recyclerview點擊偵聽器。

創建新的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()方法來殺死線程或服務