2012-03-27 7 views
0

どうすればいいですか? スレッドを試しましたが、何も起こりませんでした。リスナーの内部で1秒待つ?

 myView.setOnTouchListener(new OnTouchListener() 
     { 
      public boolean onTouch(View arg0, MotionEvent arg1) 
      { 
       myButton.setClickable(false); 

       //Here i want to wait 1 second then: 

       myButton.setClickable(true); 

       return false; 
      } 

     }); 

誰でも私のコード内で待っている秒を実装できますか?

+0

http://stackoverflow.com/questionsのDUPのためにブロックされます/ 4958628/how-to-start-a-different-activity-with-some-delay-after-a-button-inおよび – stark

答えて

7

あなたがそこで待つなら、あなたはUIスレッドをブロックします。あなたのユーザーはあなたを憎むでしょう。あなたが達成したいことをさらに詳しく記述すれば、より良い解決策を手に入れることができます。

より良い解決策はpostDelayed方法に

myView.setOnTouchListener(new OnTouchListener() 
    { 
     public boolean onTouch(View arg0, MotionEvent arg1) 
     { 
      myButton.setClickable(false); 

      //wait 1 second 
      myButton.postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        myButton.setClickable(true);       
       } 
      }, 1000); 


      return false; 
     } 

    }); 
+0

私はあなたが2度downvotedされていると仮定します。これはOPの答えとして与えられているためです(GUIイベントハンドラで待っているのが本当に不自由なデザインであっても)。 –

+2

ええ。私はopがトップの投票回答を使用するのではなく、uiをブロックしない解決策を使用することを願っています。 – Renard

-3

getThread().sleep(1000)適切なtry catchブロックを含む。

+0

(1) 'getThread()'は必要ではありません。 。 'Thread.sleep'は静的で、もしあなたがそれをThreadオブジェクトで呼び出すことに慣れてしまうと、それを呼び出すスレッドがスリープ状態に陥る(間違った)印象を受けるかもしれません。 * 糸。 (2) 'sleep(...)'は*ほとんど常に*間違った答えです。この場合、UIスレッド上で実行されているため、待機中のUIはフリーズします。可能であれば、これを非同期的に行うほうがずっと良いでしょう(これは、他の答えでもわかるように)。 – cHao

6

を使用することですあなたは間違いなくのThread.sleep(1000)を呼び出すことによって、UIスレッドをブロックする必要はありません、だから、どのハンドラを介してそれを達成する必要がありますUIスレッド上で1秒後に所望の動作を実行します:

//initialize it in your activity so that the handler is bound to UI thread 
Handler handlerUI = new Handler(); 

myView.setOnTouchListener(new OnTouchListener() 
     { 
      public boolean onTouch(View arg0, MotionEvent arg1) 
      { 
       myButton.setClickable(false); 

       //Here i want to wait 1 second then: 

       handlerUI.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         myButton.setClickable(true); 
        } 
       }, 1000); 

       return false; 
      } 

     }); 
+0

私はちょうどhandlerUIを初期化しなければならなかったが、とてもうまく動作する、ありがとう。 –

+0

ええ、それを行うための標準的な方法です。 DONTを使用する* Thread.Sleep *(他の回答に記載されているように)ハングする/ UIスレッドを1秒間ブロックする – waqaslam

1

あなたはこのようなCountDownTimer 1と第二使用することができます。

public boolean onTouch(View arg0, MotionEvent arg1) 
      { 
       myButton.setClickable(false); 

       //Here i want to wait 1 second then: 
       new CountDownTimer(1000,1000) { 

      @Override 
      public void onTick(long arg0) {} 

      @Override 
      public void onFinish() { 
       myButton.setClickable(true); 
      } 
     }.start(); 
       return false; 
      } 

NB:あなたはThread.sleep(int miliseconds) ;を使用した場合あなたのUIはしばらく

-1
Thread.sleep(1000); 

または

Thread.currentThread().sleep(1000); 
+0

別のユーザーがすでにこの解決策を提案しています。残念ながら、UIのスリープスレッドを妨害するように見えますが、これはユーザビリティから大幅に低下します。 – Compass

0
final CountDownTimer gps_timer; 
    isLocationAvailable=false; 
    m_forsms=forsms; 

    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0f, this); 
     else 
    { 
     sendLocation_network(forsms); 
     return; 
    } 

    gps_timer = new CountDownTimer(15000,1000) { 

     int nn=0; 
     @Override 
     public void onTick(long arg0) { 
      nn++; 
      Toast.makeText(context, "gps counter :" + nn, Toast.LENGTH_SHORT).show(); 
      if (isLocationAvailable) { 
       locationManager.removeUpdates(SendSMS.this); 
       gps_h.sendEmptyMessage(0); 

      } 
     } 


     @Override 
     public void onFinish() { 
      if (isLocationAvailable) { 
       locationManager.removeUpdates(SendSMS.this); 
       //Toast.makeText(context, "gps finish ok :" + nn, Toast.LENGTH_LONG).show(); 
      } 
      else 
      { 
       //Toast.makeText(context, "GPS Fail :" + nn, Toast.LENGTH_LONG).show(); 
       sendLocation_network(m_forsms); 

      } 
     } 
    }; 

     gps_h=new Handler(new Handler.Callback() { 
     @Override 
     public boolean handleMessage(Message message) { 
      gps_timer.cancel(); 
      return true; 
     } 
    }); 

    gps_timer.start(); 
+0

キャンセルカウンターにhadlerを使用することができます – user3892895

関連する問題