2017-05-01 7 views
0

私はインターネットを介して家電機器やユーティリティを制御できるIoTプロジェクトを作成しています。下のコードでは、スイッチが有効になっているときにカーテンを開きます。私がここでやりたいことは、カーテンが全開になるまでボタンを無効にすることです。カーテンが全開になるまで5秒かかるので、ボタンが完全に開くまでボタンを押してカーテンを閉じることができません。サーボモーター)。私はこれを達成するために以下のコードを書いた。 Timerクラスを使用します。しかし、スイッチをまったく無効にするわけではありません。どんな助けもありがとう。ありがとう!タイマーが一定時間のボタン無効化機能を実行しない

curtain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 

       StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         if (response.equals("open")) { 
          Toast.makeText(getApplicationContext(), "Curtain is opening..", Toast.LENGTH_LONG).show(); 
          final long period = 5000; 
          new Timer().schedule(new TimerTask() { 
           @Override 
           public void run() { 
            curtain.setEnabled(false); 
           } 
          }, System.currentTimeMillis(), period); 
           curtain.setEnabled(true); 
         } else { 
          Toast.makeText(getApplicationContext(), "Failed to open", Toast.LENGTH_SHORT).show(); 
         } 

        } 

       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(getApplicationContext(), "Connection failed. Please check your internet connection.", Toast.LENGTH_SHORT).show(); 
         error.printStackTrace(); 

        } 
       }) { 
        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 
         Map<String, String> getData = new HashMap<>(); 
         getData.put("device", "curtain"); 
         getData.put("action", "open"); 
         return getData; 
        } 
       }; 

       IotSingleton.getInstance(MainActivity.this).addToRequestQue(stringRequest); 
      } 

答えて

2

単に以下のようにHandlerを使用します。

 ... 
     @Override 
     public void onResponse(String response) { 

      if (response.equals("open")) { 
       buttonView.setEnabled(false); 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         buttonView.setEnabled(true); 
        } 
       }, 5000); 
      } else { 
       Toast.makeText(getApplicationContext(), "Failed to open", Toast.LENGTH_SHORT).show(); 
      } 

     } 
     ... 

それはあなたのために働くかどうかを確認します...!

+0

解決に感謝します。それは魅力のように働く。上記のコードで、学習のために私が間違っていたことを説明できますか? –

+0

@SahadNkこちらのドキュメントをお読みください:https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html#schedule(java.util.TimerTask,%20long,%20long) –

関連する問題