2017-10-28 6 views
1

Android에서 새로운 기능 ... 버튼을 클릭하여 이미지를 전환하는 앱을 개발했으며 Handler Runnable을 추가하여 이미지가 자동으로 전환되도록했습니다 (또한 버튼)의 지연 시간은 5000ms이다. 그러나 나는 버튼을 누른 순간에이 지연에 대한 핸들러를 중단해야하며 어떤 이유로이 작업을 수행 할 수 없습니다.postDelay에서 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 (this); –

+0

@CommonsWare하지만 run() 메소드의 if 문에 이미 추가했습니다. 'handler.removeCallbacks (this);' –

답변

0

을 클릭합니다. 그러나 이해할 수있는대로 다음을 시도하십시오.

먼저 RunnableHandler을 클래스 내부에 전역으로 만듭니다. 실행 가능한의

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

내에서 실행 방법 : onclick을 내 지금

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

:

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'을 시작하기 때문에 활동 시작시 시작하기 위해'onCreate' 안에 있습니다. –

관련 문제