2017-10-28 5 views
1

私はAndroidの新機能です...ボタンをクリックして画像をトランジションするアプリケーションを開発し、ハンドラランナブルを追加して、遅延時間は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(ラン)'実行可能なのrunメソッド内

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

その 'Runnable'をキャンセルします。 – CommonsWare

+0

ですが、すでにrun()メソッドのif文に追加しています。 handler.removeCallbacks(this); –

+0

@CommonsWareでは、すでにrun()メソッドのif文に追加しています。 'handler.removeCallbacks(this);' –

答えて

0

をクリックします。しかし、私が理解する限り、以下を試してください。

まず、RunnableHandlerをクラス内にグローバルにします。今

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'を起動するので、アクティビティの開始時に起動するために' onCreate'の内部にあります。 –

関連する問題