2017-10-28 105 views
1

我是Android新手......我开发了一个应用程序,通过单击按钮来转换图像,并添加Handler Runnable以自动获取图像转换(也可以在未按下按钮时),延迟时间为5000ms。但我必须在此时按下按钮停止处理程序,因为某些原因我无法执行此操作。如何停止postnlay中的Runnable Handler

public class MainActivity extends AppCompatActivity { 

    private Integer images[]={R.drawable.pic1, R.drawable.pic21, .... 
    public int currImage=0; 
    public int ThreadCnt = 0; 
    public boolean backInt=true,forwardInc=false, ThreadInc=true; 
... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
... 
    initializeImageSwitcher(); 
    setInitialImage(); 
    setImageRotateListener(); 

    final Handler handler = new Handler(); 

      final Runnable run = new Runnable() { 
       @Override 
      public void run() { 

    //forwardInc is a Boolean indicating that click button occurred 
       if(forwardInc){ 
    //and in this case (of forwardInc=true) I want to stop runnable for 5sec 
        handler.removeCallbacks(this); 
        handler.postDelayed(this, 5000); 
        forwardInc=false; 
        setInitialImage(); 
        setImageRotateListener(); 
        currImage++; 
        ThreadCnt++; 
} 
      handler.postDelayed(this, 5000); 

    } 
    }; 
    handler.post(run); 

,这是该按钮的代码单击

public void setImageRotateListener() { 
     final Button rotatebutton=(Button) findViewById(R.id.btnRotateImage); 
     rotatebutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       currImage++; 
//forwardInc indicating that click button occurred 
       forwardInc=true; 
       ... 
       setCurrentImage(); 
    ... 
+0

呼叫'handler.removeCallbacks(运行)'取消那个'Runnable'。 – CommonsWare

+0

但我已经将它添加到run()方法中的if语句中。 handler.removeCallbacks(本); –

+0

@CommonsWare,但我已经将它添加到run()方法中的if语句中。 'handler.removeCallbacks(本);' –

回答

0

它仍然是不清楚你想要做什么。但据我了解,请尝试以下内容:

首先,使RunnableHandler全局在课堂内。可运行

public class MainActivity extends AppCompatActivity{ 
    private Handler handler = new Handler(); 
    private Runnable runnable = new Runnable(){ 
     public void run(){/**/} 
    } 
    //other declarations. 
    //methods 
} 

内运行方法:

public void run(){ 
    setInitialImage(); //probably set next image 
    currImage++; 
    ThreadCnt++; 
    handler.postDelayed(this, 5000) 
} 

现在里面的onClick:

public void onClick(View view){ 
    handler.removeCallbacks(this); 
    handler.postDelayed(this, 5000); 
    //no idea why you are using other code here. 
} 

而且里面的onCreate:

//other lines 
setImageRotateListener(); 
handler.post(runnable); 
+0

太棒了!您的解决方案解决了问题。你能解释一下为什么'Runnable'和'Handler' Global是必不可少的,为什么'handler.post(runnable);'应该在onCreate里面。谢谢。 –

+0

他们是全球化的,所以他们可以从该类中的任何方法访问。 'handler.post(runnable);'启动'runnable',所以要在activity开始时启动它,它在'onCreate'内。 –